codd-dev 3.1.0__tar.gz → 3.2.0__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 (626) hide show
  1. {codd_dev-3.1.0 → codd_dev-3.2.0}/PKG-INFO +1 -1
  2. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/__init__.py +1 -1
  3. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/cli.py +14 -0
  4. codd_dev-3.2.0/codd/dag/impact.py +563 -0
  5. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/fix/candidate_selector.py +21 -4
  6. codd_dev-3.2.0/codd/fix/impact_planner.py +2234 -0
  7. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/fix/impl_propagation.py +201 -18
  8. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/fix/phenomenon_fixer.py +150 -15
  9. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/fix/phenomenon_parser.py +52 -1
  10. codd_dev-3.2.0/codd/fix/templates/phenomenon_parse.txt +63 -0
  11. {codd_dev-3.1.0 → codd_dev-3.2.0}/pyproject.toml +1 -1
  12. codd_dev-3.1.0/codd/dag/impact.py +0 -201
  13. codd_dev-3.1.0/codd/fix/templates/phenomenon_parse.txt +0 -34
  14. {codd_dev-3.1.0 → codd_dev-3.2.0}/.gitignore +0 -0
  15. {codd_dev-3.1.0 → codd_dev-3.2.0}/LICENSE +0 -0
  16. {codd_dev-3.1.0 → codd_dev-3.2.0}/README.md +0 -0
  17. {codd_dev-3.1.0 → codd_dev-3.2.0}/bench_fixture/README.md +0 -0
  18. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/__main__.py +0 -0
  19. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/_git_helper.py +0 -0
  20. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/action_outcome.py +0 -0
  21. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/ai_invoke.py +0 -0
  22. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/ai_patch.py +0 -0
  23. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/artifact_contract.py +0 -0
  24. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/artifact_ids.py +0 -0
  25. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/artifacts/catalog.yaml +0 -0
  26. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/ask_user_question_adapter.py +0 -0
  27. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/assembler.py +0 -0
  28. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/bridge.py +0 -0
  29. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/brownfield/__init__.py +0 -0
  30. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/brownfield/pipeline.py +0 -0
  31. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/capability_completeness.py +0 -0
  32. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/claude_cli.py +0 -0
  33. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/clustering.py +0 -0
  34. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/coherence_adapters.py +0 -0
  35. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/coherence_engine.py +0 -0
  36. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/confidence.py +0 -0
  37. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/config.py +0 -0
  38. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/config_schema.py +0 -0
  39. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/contracts.py +0 -0
  40. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/contracts_registry/__init__.py +0 -0
  41. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/contracts_registry/__main__.py +0 -0
  42. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/contracts_registry/certify.py +0 -0
  43. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/contracts_registry/generate_matrix.py +0 -0
  44. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/contracts_registry/registry.py +0 -0
  45. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/coverage_auditor.py +0 -0
  46. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/coverage_execution_coherence.py +0 -0
  47. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/coverage_metrics.py +0 -0
  48. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/dag/__init__.py +0 -0
  49. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/dag/auto_repair.py +0 -0
  50. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/dag/builder.py +0 -0
  51. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/dag/checks/__init__.py +0 -0
  52. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/dag/checks/_one_to_many_detection.py +0 -0
  53. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/dag/checks/artifact_contract_check.py +0 -0
  54. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/dag/checks/ci_health.py +0 -0
  55. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/dag/checks/dependency_freshness.py +0 -0
  56. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/dag/checks/depends_on_consistency.py +0 -0
  57. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/dag/checks/deployment_completeness.py +0 -0
  58. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/dag/checks/edge_validity.py +0 -0
  59. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/dag/checks/environment_coverage.py +0 -0
  60. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/dag/checks/implementation_coverage.py +0 -0
  61. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/dag/checks/node_completeness.py +0 -0
  62. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/dag/checks/opt_out.py +0 -0
  63. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/dag/checks/task_completion.py +0 -0
  64. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/dag/checks/transitive_closure.py +0 -0
  65. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/dag/checks/ui_coherence.py +0 -0
  66. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/dag/checks/user_journey_coherence.py +0 -0
  67. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/dag/coverage_axes.py +0 -0
  68. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/dag/defaults/cli.yaml +0 -0
  69. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/dag/defaults/cpp_embedded.yaml +0 -0
  70. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/dag/defaults/csharp.yaml +0 -0
  71. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/dag/defaults/elixir.yaml +0 -0
  72. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/dag/defaults/generic.yaml +0 -0
  73. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/dag/defaults/iot.yaml +0 -0
  74. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/dag/defaults/java.yaml +0 -0
  75. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/dag/defaults/kotlin.yaml +0 -0
  76. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/dag/defaults/mobile.yaml +0 -0
  77. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/dag/defaults/ruby.yaml +0 -0
  78. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/dag/defaults/rust.yaml +0 -0
  79. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/dag/defaults/scala.yaml +0 -0
  80. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/dag/defaults/swift.yaml +0 -0
  81. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/dag/defaults/test_frameworks.yaml +0 -0
  82. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/dag/defaults/web.yaml +0 -0
  83. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/dag/extractor.py +0 -0
  84. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/dag/runner.py +0 -0
  85. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/defaults.py +0 -0
  86. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/defaults.yaml +0 -0
  87. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/dependency_lock_coherence.py +0 -0
  88. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/deploy_targets/__init__.py +0 -0
  89. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/deploy_targets/app_service.py +0 -0
  90. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/deploy_targets/base.py +0 -0
  91. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/deploy_targets/docker_compose.py +0 -0
  92. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/deployer.py +0 -0
  93. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/deployment/__init__.py +0 -0
  94. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/deployment/checks/__init__.py +0 -0
  95. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/deployment/defaults/deploy_targets.yaml +0 -0
  96. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/deployment/defaults/runtime_capability_inference.yaml +0 -0
  97. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/deployment/defaults/schema_providers.yaml +0 -0
  98. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/deployment/defaults/verification_templates.yaml +0 -0
  99. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/deployment/extractor.py +0 -0
  100. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/deployment/providers/__init__.py +0 -0
  101. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/deployment/providers/ai_command.py +0 -0
  102. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/deployment/providers/ai_command_factory.py +0 -0
  103. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/deployment/providers/codex_app_server.py +0 -0
  104. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/deployment/providers/llm_consideration.py +0 -0
  105. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/deployment/providers/schema/__init__.py +0 -0
  106. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/deployment/providers/schema/prisma.py +0 -0
  107. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/deployment/providers/target/__init__.py +0 -0
  108. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/deployment/providers/target/docker_compose.py +0 -0
  109. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/deployment/providers/verification/__init__.py +0 -0
  110. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/deployment/providers/verification/assertion_handlers.py +0 -0
  111. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/deployment/providers/verification/cdp_browser.py +0 -0
  112. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/deployment/providers/verification/cdp_engines.py +0 -0
  113. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/deployment/providers/verification/cdp_launchers.py +0 -0
  114. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/deployment/providers/verification/cdp_wire.py +0 -0
  115. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/deployment/providers/verification/curl.py +0 -0
  116. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/deployment/providers/verification/form_strategies.py +0 -0
  117. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/deployment/providers/verification/means_catalog.py +0 -0
  118. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/deployment/providers/verification/playwright.py +0 -0
  119. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/deployment/providers/verification/pytest_http.py +0 -0
  120. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/deployment/providers/verification/vitest.py +0 -0
  121. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/design_md.py +0 -0
  122. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/diff/__init__.py +0 -0
  123. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/diff/apply.py +0 -0
  124. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/diff/engine.py +0 -0
  125. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/diff/persistence.py +0 -0
  126. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/diff/templates/diff_prompt.md +0 -0
  127. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/discovery.py +0 -0
  128. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/drift.py +0 -0
  129. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/e2e_contract_coherence.py +0 -0
  130. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/e2e_extractor.py +0 -0
  131. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/e2e_generator.py +0 -0
  132. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/e2e_harness.py +0 -0
  133. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/e2e_runner.py +0 -0
  134. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/elicit/__init__.py +0 -0
  135. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/elicit/apply.py +0 -0
  136. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/elicit/engine.py +0 -0
  137. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/elicit/finding.py +0 -0
  138. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/elicit/formatters/__init__.py +0 -0
  139. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/elicit/formatters/base.py +0 -0
  140. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/elicit/formatters/interactive.py +0 -0
  141. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/elicit/formatters/json_fmt.py +0 -0
  142. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/elicit/formatters/md.py +0 -0
  143. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/elicit/lexicon_loader.py +0 -0
  144. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/elicit/persistence.py +0 -0
  145. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/elicit/templates/elicit_prompt_L0.md +0 -0
  146. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/env_refs.py +0 -0
  147. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/extract_ai.py +0 -0
  148. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/extract_paths.py +0 -0
  149. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/extractor.py +0 -0
  150. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/fix/__init__.py +0 -0
  151. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/fix/design_updater.py +0 -0
  152. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/fix/interactive_prompt.py +0 -0
  153. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/fix/risk_classifier.py +0 -0
  154. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/fix/templates/clarification_question.txt +0 -0
  155. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/fix/templates/design_update.txt +0 -0
  156. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/fix/templates/impl_update.txt +0 -0
  157. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/fix/templates/risk_assessment.txt +0 -0
  158. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/fix/templates_loader.py +0 -0
  159. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/fixer.py +0 -0
  160. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/fixup_drift.py +0 -0
  161. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/fixup_drift_strategies/__init__.py +0 -0
  162. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/fixup_drift_strategies/design_token_drift.py +0 -0
  163. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/fixup_drift_strategies/lexicon_violation.py +0 -0
  164. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/fixup_drift_strategies/url_drift.py +0 -0
  165. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/frontmatter.py +0 -0
  166. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/generator.py +0 -0
  167. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/git_evidence.py +0 -0
  168. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/graph.py +0 -0
  169. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/greenfield/__init__.py +0 -0
  170. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/greenfield/pipeline.py +0 -0
  171. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/hitl_session.py +0 -0
  172. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/hooks/__init__.py +0 -0
  173. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/hooks/pre-commit +0 -0
  174. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/hooks/recipes/claude_requirements_nudge.json +0 -0
  175. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/hooks/recipes/claude_settings_example.json +0 -0
  176. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/hooks/recipes/codex_hook.sh +0 -0
  177. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/hooks/recipes/git_post_commit.sh +0 -0
  178. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/hooks/recipes/git_pre_commit.sh +0 -0
  179. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/iac_nfr.py +0 -0
  180. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/implement_oracle.py +0 -0
  181. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/implement_oracle_scope.py +0 -0
  182. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/implement_oracle_types.py +0 -0
  183. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/implementer/__init__.py +0 -0
  184. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/implementer/chunked_runner.py +0 -0
  185. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/implementer/typecheck_loop.py +0 -0
  186. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/implementer.py +0 -0
  187. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/import_coherence.py +0 -0
  188. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/inheritance.py +0 -0
  189. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/init/__init__.py +0 -0
  190. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/init/lexicon_suggest.py +0 -0
  191. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/init/llm_lexicon_suggester.py +0 -0
  192. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/init/stack_detector.py +0 -0
  193. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/knowledge_fetcher.py +0 -0
  194. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/languages/__init__.py +0 -0
  195. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/languages/adapters/__init__.py +0 -0
  196. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/languages/adapters/implement_oracle.py +0 -0
  197. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/languages/adapters/oracle_go.py +0 -0
  198. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/languages/adapters/oracle_python.py +0 -0
  199. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/languages/adapters/oracle_typescript.py +0 -0
  200. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/languages/adapters/runner_report.py +0 -0
  201. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/languages/builtin_adapters.py +0 -0
  202. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/languages/compat.py +0 -0
  203. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/languages/contract.py +0 -0
  204. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/languages/loader.py +0 -0
  205. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/languages/oracle_executor.py +0 -0
  206. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/languages/path_planner.py +0 -0
  207. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/languages/profile.py +0 -0
  208. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/languages/profiles/go.yaml +0 -0
  209. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/languages/profiles/python.yaml +0 -0
  210. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/languages/profiles/typescript.yaml +0 -0
  211. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/languages/registry.py +0 -0
  212. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/languages/verify_executor.py +0 -0
  213. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/languages/verify_plan.py +0 -0
  214. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/lexicon.py +0 -0
  215. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/lexicon_cli/__init__.py +0 -0
  216. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/lexicon_cli/formatters/__init__.py +0 -0
  217. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/lexicon_cli/formatters/html.py +0 -0
  218. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/lexicon_cli/formatters/json_fmt.py +0 -0
  219. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/lexicon_cli/formatters/md.py +0 -0
  220. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/lexicon_cli/inspector.py +0 -0
  221. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/lexicon_cli/manager.py +0 -0
  222. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/lexicon_cli/reporter.py +0 -0
  223. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/lexicon_cli/threshold.py +0 -0
  224. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/llm/__init__.py +0 -0
  225. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/llm/approval.py +0 -0
  226. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/llm/best_practice_augmenter.py +0 -0
  227. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/llm/criteria_expander.py +0 -0
  228. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/llm/design_doc_extractor.py +0 -0
  229. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/llm/impl_step_deriver.py +0 -0
  230. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/llm/means_catalog_loader.py +0 -0
  231. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/llm/parser.py +0 -0
  232. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/llm/plan_deriver.py +0 -0
  233. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/llm/prompt_builder.py +0 -0
  234. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/llm/strategy_validator.py +0 -0
  235. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/llm/templates/best_practice_augment_meta.md +0 -0
  236. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/llm/templates/criteria_expand_meta.md +0 -0
  237. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/llm/templates/design_doc_extract_meta.md +0 -0
  238. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/llm/templates/impl_step_derive_meta.md +0 -0
  239. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/llm/templates/implementation_step_catalog.yaml +0 -0
  240. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/llm/templates/meta_instruction.md +0 -0
  241. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/llm/templates/plan_derive_meta.md +0 -0
  242. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/llm/templates/verification_means_catalog.yaml +0 -0
  243. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/mcp_server.py +0 -0
  244. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/measure.py +0 -0
  245. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/operational_e2e_audit.py +0 -0
  246. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/operations_derive.py +0 -0
  247. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/parsing/__init__.py +0 -0
  248. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/parsing/_shared.py +0 -0
  249. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/parsing/api_specs.py +0 -0
  250. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/parsing/extractor_registry.py +0 -0
  251. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/parsing/filesystem_routes.py +0 -0
  252. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/parsing/iac.py +0 -0
  253. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/parsing/python_ast.py +0 -0
  254. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/parsing/regex_strategies.py +0 -0
  255. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/parsing/schemas.py +0 -0
  256. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/parsing/tests_builddeps.py +0 -0
  257. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/parsing/treesitter.py +0 -0
  258. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/planner.py +0 -0
  259. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/policy.py +0 -0
  260. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/preflight/__init__.py +0 -0
  261. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/preflight/defaults/cli.yaml +0 -0
  262. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/preflight/defaults/generic.yaml +0 -0
  263. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/preflight/defaults/iot.yaml +0 -0
  264. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/preflight/defaults/mobile.yaml +0 -0
  265. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/preflight/defaults/web.yaml +0 -0
  266. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/project_types.py +0 -0
  267. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/propagate.py +0 -0
  268. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/propagation_common.py +0 -0
  269. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/propagator.py +0 -0
  270. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/reconciliation_ledger.py +0 -0
  271. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/reference_resolution.py +0 -0
  272. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/registry.py +0 -0
  273. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/repair/__init__.py +0 -0
  274. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/repair/approval_repair.py +0 -0
  275. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/repair/auto_scope_guard.py +0 -0
  276. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/repair/engine.py +0 -0
  277. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/repair/git_patcher.py +0 -0
  278. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/repair/history.py +0 -0
  279. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/repair/llm_repair_engine.py +0 -0
  280. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/repair/loop.py +0 -0
  281. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/repair/primary_picker.py +0 -0
  282. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/repair/proof_breaks.py +0 -0
  283. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/repair/repair_result.py +0 -0
  284. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/repair/repairability_classifier.py +0 -0
  285. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/repair/schema.py +0 -0
  286. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/repair/templates/analyze_meta.md +0 -0
  287. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/repair/templates/propose_meta.md +0 -0
  288. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/repair/templates/repair_strategy_meta.md +0 -0
  289. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/repair/templates/repairability_meta.md +0 -0
  290. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/repair/test_failure_attribution.py +0 -0
  291. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/repair/verify_runner.py +0 -0
  292. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/repair_slice.py +0 -0
  293. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/require.py +0 -0
  294. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/require_plugins.py +0 -0
  295. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/require_propagate.py +0 -0
  296. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/required_artifacts/defaults/cli.yaml +0 -0
  297. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/required_artifacts/defaults/generic.yaml +0 -0
  298. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/required_artifacts/defaults/iot.yaml +0 -0
  299. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/required_artifacts/defaults/mobile.yaml +0 -0
  300. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/required_artifacts/defaults/web.yaml +0 -0
  301. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/required_artifacts_deriver.py +0 -0
  302. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/requirement_completeness/defaults/cli.yaml +0 -0
  303. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/requirement_completeness/defaults/generic.yaml +0 -0
  304. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/requirement_completeness/defaults/iot.yaml +0 -0
  305. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/requirement_completeness/defaults/mobile.yaml +0 -0
  306. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/requirement_completeness/defaults/web.yaml +0 -0
  307. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/requirement_completeness_auditor.py +0 -0
  308. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/requirement_reconciliation.py +0 -0
  309. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/requirements_meta.py +0 -0
  310. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/restoration_report.py +0 -0
  311. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/restore.py +0 -0
  312. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/routes_extractor.py +0 -0
  313. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/runtime_smoke/__init__.py +0 -0
  314. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/runtime_smoke/checks.py +0 -0
  315. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/runtime_smoke/config.py +0 -0
  316. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/runtime_smoke/report.py +0 -0
  317. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/runtime_smoke/runner.py +0 -0
  318. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/scanner.py +0 -0
  319. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/schema_refs.py +0 -0
  320. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/screen_flow_validator.py +0 -0
  321. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/screen_transition_extractor.py +0 -0
  322. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/screen_transitions/defaults.yaml +0 -0
  323. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/skills_cli/__init__.py +0 -0
  324. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/skills_cli/discovery.py +0 -0
  325. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/skills_cli/manager.py +0 -0
  326. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/skills_cli/paths.py +0 -0
  327. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/stack/__init__.py +0 -0
  328. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/stack/adapters/__init__.py +0 -0
  329. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/stack/adapters/_base.py +0 -0
  330. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/stack/adapters/nextjs.py +0 -0
  331. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/stack/adapters/playwright.py +0 -0
  332. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/stack/adapters/prisma.py +0 -0
  333. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/stack/command_authenticity.py +0 -0
  334. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/stack/command_override.py +0 -0
  335. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/stack/command_plan.py +0 -0
  336. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/stack/compose.py +0 -0
  337. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/stack/loader.py +0 -0
  338. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/stack/lock.py +0 -0
  339. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/stack/obligations.py +0 -0
  340. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/stack/profile.py +0 -0
  341. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/stack/profiles/addons/playwright.yaml +0 -0
  342. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/stack/profiles/addons/prisma.yaml +0 -0
  343. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/stack/profiles/frameworks/nextjs.yaml +0 -0
  344. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/stack/project.py +0 -0
  345. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/stack/registry.py +0 -0
  346. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/stack/replacement_proof.py +0 -0
  347. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/stack/resolve.py +0 -0
  348. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/surface_reconciliation.py +0 -0
  349. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/synth.py +0 -0
  350. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/templates/codd.yaml.tmpl +0 -0
  351. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/templates/conventions.yaml.tmpl +0 -0
  352. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/templates/data_dependencies.yaml.tmpl +0 -0
  353. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/templates/doc_links.yaml.tmpl +0 -0
  354. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/templates/extract_ai_prompt_baseline.md +0 -0
  355. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/templates/extracted/api-contract.md.j2 +0 -0
  356. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/templates/extracted/architecture-overview.md.j2 +0 -0
  357. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/templates/extracted/module-detail.md.j2 +0 -0
  358. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/templates/extracted/schema-design.md.j2 +0 -0
  359. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/templates/extracted/system-context.md.j2 +0 -0
  360. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/templates/gitignore.tmpl +0 -0
  361. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/templates/lexicon_questions.md +0 -0
  362. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/templates/lexicon_schema.yaml +0 -0
  363. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/templates/overrides.yaml.tmpl +0 -0
  364. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/test_detection.py +0 -0
  365. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/test_import_coherence.py +0 -0
  366. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/traceability.py +0 -0
  367. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/validator.py +0 -0
  368. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/vb_marker_authenticity.py +0 -0
  369. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/vb_rerun_scope.py +0 -0
  370. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/verifiable_behavior_audit.py +0 -0
  371. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/watch/__init__.py +0 -0
  372. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/watch/events.py +0 -0
  373. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/watch/propagation_log.py +0 -0
  374. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/watch/propagation_pipeline.py +0 -0
  375. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/watch/test_runner.py +0 -0
  376. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/watch/watcher.py +0 -0
  377. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/wiring.py +0 -0
  378. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ai_governance_eu_act/coverage_matrix.md +0 -0
  379. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ai_governance_eu_act/elicit_extend.md +0 -0
  380. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ai_governance_eu_act/lexicon.yaml +0 -0
  381. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ai_governance_eu_act/manifest.yaml +0 -0
  382. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ai_governance_eu_act/recommended_kinds.yaml +0 -0
  383. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ai_governance_eu_act/severity_rules.yaml +0 -0
  384. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/api_rate_limiting_caching/coverage_matrix.md +0 -0
  385. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/api_rate_limiting_caching/elicit_extend.md +0 -0
  386. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/api_rate_limiting_caching/lexicon.yaml +0 -0
  387. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/api_rate_limiting_caching/manifest.yaml +0 -0
  388. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/api_rate_limiting_caching/recommended_kinds.yaml +0 -0
  389. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/api_rate_limiting_caching/severity_rules.yaml +0 -0
  390. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/api_rest_openapi/coverage_matrix.md +0 -0
  391. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/api_rest_openapi/elicit_extend.md +0 -0
  392. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/api_rest_openapi/lexicon.yaml +0 -0
  393. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/api_rest_openapi/manifest.yaml +0 -0
  394. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/api_rest_openapi/recommended_kinds.yaml +0 -0
  395. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/api_rest_openapi/severity_rules.yaml +0 -0
  396. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/babok/elicit_extend.md +0 -0
  397. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/babok/lexicon.yaml +0 -0
  398. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/babok/manifest.yaml +0 -0
  399. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/babok/recommended_kinds.yaml +0 -0
  400. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/babok/severity_rules.yaml +0 -0
  401. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/backend_event_cloudevents/coverage_matrix.md +0 -0
  402. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/backend_event_cloudevents/elicit_extend.md +0 -0
  403. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/backend_event_cloudevents/lexicon.yaml +0 -0
  404. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/backend_event_cloudevents/manifest.yaml +0 -0
  405. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/backend_event_cloudevents/recommended_kinds.yaml +0 -0
  406. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/backend_event_cloudevents/severity_rules.yaml +0 -0
  407. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/backend_graphql/coverage_matrix.md +0 -0
  408. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/backend_graphql/elicit_extend.md +0 -0
  409. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/backend_graphql/lexicon.yaml +0 -0
  410. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/backend_graphql/manifest.yaml +0 -0
  411. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/backend_graphql/recommended_kinds.yaml +0 -0
  412. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/backend_graphql/severity_rules.yaml +0 -0
  413. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/backend_grpc_proto/coverage_matrix.md +0 -0
  414. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/backend_grpc_proto/elicit_extend.md +0 -0
  415. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/backend_grpc_proto/lexicon.yaml +0 -0
  416. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/backend_grpc_proto/manifest.yaml +0 -0
  417. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/backend_grpc_proto/recommended_kinds.yaml +0 -0
  418. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/backend_grpc_proto/severity_rules.yaml +0 -0
  419. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/compliance_hipaa/coverage_matrix.md +0 -0
  420. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/compliance_hipaa/elicit_extend.md +0 -0
  421. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/compliance_hipaa/lexicon.yaml +0 -0
  422. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/compliance_hipaa/manifest.yaml +0 -0
  423. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/compliance_hipaa/recommended_kinds.yaml +0 -0
  424. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/compliance_hipaa/severity_rules.yaml +0 -0
  425. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/compliance_iso27001/coverage_matrix.md +0 -0
  426. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/compliance_iso27001/elicit_extend.md +0 -0
  427. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/compliance_iso27001/lexicon.yaml +0 -0
  428. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/compliance_iso27001/manifest.yaml +0 -0
  429. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/compliance_iso27001/recommended_kinds.yaml +0 -0
  430. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/compliance_iso27001/severity_rules.yaml +0 -0
  431. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/compliance_pci_dss_4/coverage_matrix.md +0 -0
  432. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/compliance_pci_dss_4/elicit_extend.md +0 -0
  433. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/compliance_pci_dss_4/lexicon.yaml +0 -0
  434. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/compliance_pci_dss_4/manifest.yaml +0 -0
  435. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/compliance_pci_dss_4/recommended_kinds.yaml +0 -0
  436. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/compliance_pci_dss_4/severity_rules.yaml +0 -0
  437. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/data_aggregation_policies/coverage_matrix.md +0 -0
  438. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/data_aggregation_policies/elicit_extend.md +0 -0
  439. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/data_aggregation_policies/lexicon.yaml +0 -0
  440. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/data_aggregation_policies/manifest.yaml +0 -0
  441. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/data_aggregation_policies/recommended_kinds.yaml +0 -0
  442. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/data_aggregation_policies/severity_rules.yaml +0 -0
  443. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/coverage_matrix.md +0 -0
  444. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/elicit_extend.md +0 -0
  445. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/lexicon.yaml +0 -0
  446. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/manifest.yaml +0 -0
  447. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/recommended_kinds.yaml +0 -0
  448. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/severity_rules.yaml +0 -0
  449. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/data_governance_appi_gdpr/coverage_matrix.md +0 -0
  450. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/data_governance_appi_gdpr/elicit_extend.md +0 -0
  451. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/data_governance_appi_gdpr/lexicon.yaml +0 -0
  452. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/data_governance_appi_gdpr/manifest.yaml +0 -0
  453. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/data_governance_appi_gdpr/recommended_kinds.yaml +0 -0
  454. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/data_governance_appi_gdpr/severity_rules.yaml +0 -0
  455. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/data_nosql_jsonschema/coverage_matrix.md +0 -0
  456. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/data_nosql_jsonschema/elicit_extend.md +0 -0
  457. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/data_nosql_jsonschema/lexicon.yaml +0 -0
  458. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/data_nosql_jsonschema/manifest.yaml +0 -0
  459. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/data_nosql_jsonschema/recommended_kinds.yaml +0 -0
  460. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/data_nosql_jsonschema/severity_rules.yaml +0 -0
  461. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/data_relational_iso_sql/coverage_matrix.md +0 -0
  462. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/data_relational_iso_sql/elicit_extend.md +0 -0
  463. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/data_relational_iso_sql/lexicon.yaml +0 -0
  464. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/data_relational_iso_sql/manifest.yaml +0 -0
  465. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/data_relational_iso_sql/recommended_kinds.yaml +0 -0
  466. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/data_relational_iso_sql/severity_rules.yaml +0 -0
  467. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ddd_domain_driven_design/coverage_matrix.md +0 -0
  468. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ddd_domain_driven_design/elicit_extend.md +0 -0
  469. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ddd_domain_driven_design/lexicon.yaml +0 -0
  470. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ddd_domain_driven_design/manifest.yaml +0 -0
  471. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ddd_domain_driven_design/recommended_kinds.yaml +0 -0
  472. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ddd_domain_driven_design/severity_rules.yaml +0 -0
  473. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/dora_sre_metrics/coverage_matrix.md +0 -0
  474. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/dora_sre_metrics/elicit_extend.md +0 -0
  475. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/dora_sre_metrics/lexicon.yaml +0 -0
  476. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/dora_sre_metrics/manifest.yaml +0 -0
  477. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/dora_sre_metrics/recommended_kinds.yaml +0 -0
  478. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/dora_sre_metrics/severity_rules.yaml +0 -0
  479. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/i18n_unicode_cldr/coverage_matrix.md +0 -0
  480. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/i18n_unicode_cldr/elicit_extend.md +0 -0
  481. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/i18n_unicode_cldr/lexicon.yaml +0 -0
  482. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/i18n_unicode_cldr/manifest.yaml +0 -0
  483. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/i18n_unicode_cldr/recommended_kinds.yaml +0 -0
  484. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/i18n_unicode_cldr/severity_rules.yaml +0 -0
  485. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ml_model_cards/coverage_matrix.md +0 -0
  486. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ml_model_cards/elicit_extend.md +0 -0
  487. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ml_model_cards/lexicon.yaml +0 -0
  488. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ml_model_cards/manifest.yaml +0 -0
  489. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ml_model_cards/recommended_kinds.yaml +0 -0
  490. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ml_model_cards/severity_rules.yaml +0 -0
  491. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/mobile_a11y_native/coverage_matrix.md +0 -0
  492. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/mobile_a11y_native/elicit_extend.md +0 -0
  493. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/mobile_a11y_native/lexicon.yaml +0 -0
  494. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/mobile_a11y_native/manifest.yaml +0 -0
  495. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/mobile_a11y_native/recommended_kinds.yaml +0 -0
  496. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/mobile_a11y_native/severity_rules.yaml +0 -0
  497. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/mobile_android_material3/coverage_matrix.md +0 -0
  498. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/mobile_android_material3/elicit_extend.md +0 -0
  499. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/mobile_android_material3/lexicon.yaml +0 -0
  500. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/mobile_android_material3/manifest.yaml +0 -0
  501. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/mobile_android_material3/recommended_kinds.yaml +0 -0
  502. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/mobile_android_material3/severity_rules.yaml +0 -0
  503. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/mobile_ios_hig/coverage_matrix.md +0 -0
  504. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/mobile_ios_hig/elicit_extend.md +0 -0
  505. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/mobile_ios_hig/lexicon.yaml +0 -0
  506. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/mobile_ios_hig/manifest.yaml +0 -0
  507. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/mobile_ios_hig/recommended_kinds.yaml +0 -0
  508. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/mobile_ios_hig/severity_rules.yaml +0 -0
  509. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/mobile_security_masvs/coverage_matrix.md +0 -0
  510. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/mobile_security_masvs/elicit_extend.md +0 -0
  511. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/mobile_security_masvs/lexicon.yaml +0 -0
  512. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/mobile_security_masvs/manifest.yaml +0 -0
  513. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/mobile_security_masvs/recommended_kinds.yaml +0 -0
  514. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/mobile_security_masvs/severity_rules.yaml +0 -0
  515. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ops_cicd_pipeline/coverage_matrix.md +0 -0
  516. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ops_cicd_pipeline/elicit_extend.md +0 -0
  517. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ops_cicd_pipeline/lexicon.yaml +0 -0
  518. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ops_cicd_pipeline/manifest.yaml +0 -0
  519. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ops_cicd_pipeline/recommended_kinds.yaml +0 -0
  520. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ops_cicd_pipeline/severity_rules.yaml +0 -0
  521. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ops_iac_terraform/coverage_matrix.md +0 -0
  522. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ops_iac_terraform/elicit_extend.md +0 -0
  523. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ops_iac_terraform/lexicon.yaml +0 -0
  524. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ops_iac_terraform/manifest.yaml +0 -0
  525. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ops_iac_terraform/recommended_kinds.yaml +0 -0
  526. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ops_iac_terraform/severity_rules.yaml +0 -0
  527. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ops_kubernetes/coverage_matrix.md +0 -0
  528. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ops_kubernetes/elicit_extend.md +0 -0
  529. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ops_kubernetes/lexicon.yaml +0 -0
  530. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ops_kubernetes/manifest.yaml +0 -0
  531. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ops_kubernetes/recommended_kinds.yaml +0 -0
  532. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ops_kubernetes/severity_rules.yaml +0 -0
  533. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ops_observability_otel/coverage_matrix.md +0 -0
  534. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ops_observability_otel/elicit_extend.md +0 -0
  535. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ops_observability_otel/lexicon.yaml +0 -0
  536. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ops_observability_otel/manifest.yaml +0 -0
  537. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ops_observability_otel/recommended_kinds.yaml +0 -0
  538. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ops_observability_otel/severity_rules.yaml +0 -0
  539. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/process_iso25010/coverage_matrix.md +0 -0
  540. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/process_iso25010/elicit_extend.md +0 -0
  541. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/process_iso25010/lexicon.yaml +0 -0
  542. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/process_iso25010/manifest.yaml +0 -0
  543. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/process_iso25010/recommended_kinds.yaml +0 -0
  544. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/process_iso25010/severity_rules.yaml +0 -0
  545. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/process_test_iso29119/coverage_matrix.md +0 -0
  546. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/process_test_iso29119/elicit_extend.md +0 -0
  547. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/process_test_iso29119/lexicon.yaml +0 -0
  548. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/process_test_iso29119/manifest.yaml +0 -0
  549. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/process_test_iso29119/recommended_kinds.yaml +0 -0
  550. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/process_test_iso29119/severity_rules.yaml +0 -0
  551. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/twelve_factor_app/coverage_matrix.md +0 -0
  552. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/twelve_factor_app/elicit_extend.md +0 -0
  553. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/twelve_factor_app/lexicon.yaml +0 -0
  554. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/twelve_factor_app/manifest.yaml +0 -0
  555. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/twelve_factor_app/recommended_kinds.yaml +0 -0
  556. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/twelve_factor_app/severity_rules.yaml +0 -0
  557. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/coverage_matrix.md +0 -0
  558. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/elicit_extend.md +0 -0
  559. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/lexicon.yaml +0 -0
  560. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/manifest.yaml +0 -0
  561. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/recommended_kinds.yaml +0 -0
  562. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/severity_rules.yaml +0 -0
  563. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_authn_webauthn/coverage_matrix.md +0 -0
  564. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_authn_webauthn/elicit_extend.md +0 -0
  565. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_authn_webauthn/lexicon.yaml +0 -0
  566. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_authn_webauthn/manifest.yaml +0 -0
  567. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_authn_webauthn/recommended_kinds.yaml +0 -0
  568. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_authn_webauthn/severity_rules.yaml +0 -0
  569. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_browser_compat/coverage_matrix.md +0 -0
  570. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_browser_compat/elicit_extend.md +0 -0
  571. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_browser_compat/lexicon.yaml +0 -0
  572. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_browser_compat/manifest.yaml +0 -0
  573. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_browser_compat/recommended_kinds.yaml +0 -0
  574. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_browser_compat/severity_rules.yaml +0 -0
  575. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_forms_html5/coverage_matrix.md +0 -0
  576. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_forms_html5/elicit_extend.md +0 -0
  577. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_forms_html5/lexicon.yaml +0 -0
  578. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_forms_html5/manifest.yaml +0 -0
  579. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_forms_html5/recommended_kinds.yaml +0 -0
  580. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_forms_html5/severity_rules.yaml +0 -0
  581. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_performance_core_web_vitals/coverage_matrix.md +0 -0
  582. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_performance_core_web_vitals/elicit_extend.md +0 -0
  583. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_performance_core_web_vitals/lexicon.yaml +0 -0
  584. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_performance_core_web_vitals/manifest.yaml +0 -0
  585. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_performance_core_web_vitals/recommended_kinds.yaml +0 -0
  586. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_performance_core_web_vitals/severity_rules.yaml +0 -0
  587. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_pwa_manifest/coverage_matrix.md +0 -0
  588. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_pwa_manifest/elicit_extend.md +0 -0
  589. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_pwa_manifest/lexicon.yaml +0 -0
  590. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_pwa_manifest/manifest.yaml +0 -0
  591. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_pwa_manifest/recommended_kinds.yaml +0 -0
  592. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_pwa_manifest/severity_rules.yaml +0 -0
  593. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_responsive/coverage_matrix.md +0 -0
  594. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_responsive/elicit_extend.md +0 -0
  595. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_responsive/lexicon.yaml +0 -0
  596. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_responsive/manifest.yaml +0 -0
  597. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_responsive/recommended_kinds.yaml +0 -0
  598. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_responsive/severity_rules.yaml +0 -0
  599. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_security_owasp/coverage_matrix.md +0 -0
  600. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_security_owasp/elicit_extend.md +0 -0
  601. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_security_owasp/lexicon.yaml +0 -0
  602. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_security_owasp/manifest.yaml +0 -0
  603. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_security_owasp/recommended_kinds.yaml +0 -0
  604. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_security_owasp/severity_rules.yaml +0 -0
  605. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_seo_schemaorg/coverage_matrix.md +0 -0
  606. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_seo_schemaorg/elicit_extend.md +0 -0
  607. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_seo_schemaorg/lexicon.yaml +0 -0
  608. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_seo_schemaorg/manifest.yaml +0 -0
  609. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_seo_schemaorg/recommended_kinds.yaml +0 -0
  610. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_seo_schemaorg/severity_rules.yaml +0 -0
  611. {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/stack_map.yaml +0 -0
  612. {codd_dev-3.1.0 → codd_dev-3.2.0}/docs/cookbook/cdp_browser/README.md +0 -0
  613. {codd_dev-3.1.0 → codd_dev-3.2.0}/docs/cookbook/presentation_aggregation/README.md +0 -0
  614. {codd_dev-3.1.0 → codd_dev-3.2.0}/docs/requirements/README.md +0 -0
  615. {codd_dev-3.1.0 → codd_dev-3.2.0}/examples/README.md +0 -0
  616. {codd_dev-3.1.0 → codd_dev-3.2.0}/skills/codd-assemble/SKILL.md +0 -0
  617. {codd_dev-3.1.0 → codd_dev-3.2.0}/skills/codd-evolve/SKILL.md +0 -0
  618. {codd_dev-3.1.0 → codd_dev-3.2.0}/skills/codd-generate/SKILL.md +0 -0
  619. {codd_dev-3.1.0 → codd_dev-3.2.0}/skills/codd-greenfield/SKILL.md +0 -0
  620. {codd_dev-3.1.0 → codd_dev-3.2.0}/skills/codd-impact/SKILL.md +0 -0
  621. {codd_dev-3.1.0 → codd_dev-3.2.0}/skills/codd-init/SKILL.md +0 -0
  622. {codd_dev-3.1.0 → codd_dev-3.2.0}/skills/codd-propagate/SKILL.md +0 -0
  623. {codd_dev-3.1.0 → codd_dev-3.2.0}/skills/codd-restore/SKILL.md +0 -0
  624. {codd_dev-3.1.0 → codd_dev-3.2.0}/skills/codd-scan/SKILL.md +0 -0
  625. {codd_dev-3.1.0 → codd_dev-3.2.0}/skills/codd-validate/SKILL.md +0 -0
  626. {codd_dev-3.1.0 → codd_dev-3.2.0}/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.1.0
3
+ Version: 3.2.0
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.1.0"
3
+ __version__ = "3.2.0"
@@ -6393,6 +6393,11 @@ def _run_phenomenon_fix_cli(
6393
6393
  f" intent={a.intent}, ambiguity={a.ambiguity_score:.2f}, "
6394
6394
  f"subject_terms={a.subject_terms[:4]}"
6395
6395
  )
6396
+ click.echo(
6397
+ f" decomposition: entities={a.entities} fields={a.fields} "
6398
+ f"operations={a.operations} surfaces={a.surfaces} "
6399
+ f"obligations={[o.get('id') for o in (a.obligations or []) if isinstance(o, dict)]}"
6400
+ )
6396
6401
 
6397
6402
  if result.aborted:
6398
6403
  click.echo(f"❌ Aborted: {result.abort_reason}")
@@ -6425,6 +6430,15 @@ def _run_phenomenon_fix_cli(
6425
6430
  applied_any = True
6426
6431
 
6427
6432
  if dry_run:
6433
+ if result.impact_plan is not None:
6434
+ plan = result.impact_plan
6435
+ click.echo(f"\n🧭 Impact plan: status={plan.status}")
6436
+ for d in plan.diagnostics:
6437
+ click.echo(f" · {d}")
6438
+ if plan.covered_obligations:
6439
+ click.echo(" coverage:")
6440
+ for oid, paths in sorted(plan.covered_obligations.items()):
6441
+ click.echo(f" {oid} <- {', '.join(paths)}")
6428
6442
  if result.propagate_impl_enabled and (
6429
6443
  result.affected_impl_paths or result.affected_test_paths
6430
6444
  ):
@@ -0,0 +1,563 @@
1
+ """Impact resolution: map a design document to affected implementation/test files.
2
+
3
+ Used by PHENOMENON-mode ``codd fix`` to decide deterministically which
4
+ implementation files (and their tests) must follow an applied design-doc
5
+ update. Resolution is DAG-first:
6
+
7
+ 1. Forward ``expects`` edges from the design node identify expected
8
+ implementation files (including one hop through lexicon ``expected``
9
+ nodes via their ``represents`` edges).
10
+ 2. Each implementation node's ``tested_by`` edges identify its test files.
11
+ 3. When a design doc declares no ``expects`` edges, the frontmatter
12
+ ``modules`` list falls back to filesystem candidate matching
13
+ (:func:`find_impl_candidates` — the generalized form of the glob
14
+ inference that ``codd.fixer`` has always used).
15
+
16
+ Everything here is generic: no project names, no framework assumptions
17
+ beyond conventional file layouts already encoded in the legacy fixer.
18
+ """
19
+
20
+ from __future__ import annotations
21
+
22
+ import re
23
+ from dataclasses import dataclass, field
24
+ from pathlib import Path
25
+ from typing import Any, Iterable
26
+
27
+ _DOC_SUFFIX = ".md"
28
+
29
+ # Source-file suffixes the impact search walks. Generic across ecosystems —
30
+ # no framework assumption, just "files that hold implementation code". The
31
+ # legacy ``find_impl_candidates`` globs decide the back-compat path; this set
32
+ # only governs the v2 path-segment / content search helpers.
33
+ _SOURCE_SUFFIXES = (
34
+ ".ts",
35
+ ".tsx",
36
+ ".js",
37
+ ".jsx",
38
+ ".mjs",
39
+ ".cjs",
40
+ ".py",
41
+ ".go",
42
+ ".rb",
43
+ ".java",
44
+ ".kt",
45
+ ".rs",
46
+ ".php",
47
+ ".cs",
48
+ ".swift",
49
+ ".scala",
50
+ ".vue",
51
+ ".svelte",
52
+ )
53
+
54
+ # Directories never worth walking for impact candidates.
55
+ _SKIP_DIR_NAMES = frozenset(
56
+ {
57
+ ".git",
58
+ ".hg",
59
+ ".svn",
60
+ ".codd",
61
+ "node_modules",
62
+ ".venv",
63
+ "venv",
64
+ "__pycache__",
65
+ ".mypy_cache",
66
+ ".pytest_cache",
67
+ ".next",
68
+ "dist",
69
+ "build",
70
+ "out",
71
+ "coverage",
72
+ ".tox",
73
+ ".idea",
74
+ ".vscode",
75
+ "target",
76
+ "vendor",
77
+ "reports",
78
+ "tmp",
79
+ "logs",
80
+ "__snapshots__",
81
+ # Installed third-party packages (any Python virtualenv, regardless of
82
+ # the venv dir's name — ``.venv``/``venv`` are caught above, but a repo
83
+ # may hold a venv under an arbitrary name). ``site-packages`` is the
84
+ # universal install location; skipping it removes the bulk of a venv's
85
+ # files so a stray in-repo virtualenv cannot pollute candidates or
86
+ # exhaust the document-frequency scan budget. Generic Python convention,
87
+ # not a project/framework name.
88
+ "site-packages",
89
+ }
90
+ )
91
+
92
+ # Cross-ecosystem dependency LOCK files: machine-generated, hash-dense, never a
93
+ # hand-edited target (like generated code). The ``.lock`` suffix catches
94
+ # yarn.lock/poetry.lock/Cargo.lock/Gemfile.lock/Pipfile.lock/flake.lock; these
95
+ # remaining names use other suffixes. Naming these is file-KIND knowledge (a
96
+ # tooling convention, like a test-file name), not a project/framework feature —
97
+ # consistent with :func:`is_test_path`. A short hex anchor can substring-match a
98
+ # hash inside such a file and fake a content certificate, so they must be
99
+ # excluded from the search/frequency universe.
100
+ _DEPENDENCY_LOCK_NAMES = frozenset(
101
+ {
102
+ "package-lock.json",
103
+ "npm-shrinkwrap.json",
104
+ "pnpm-lock.yaml",
105
+ "bun.lockb",
106
+ "go.sum",
107
+ "composer.lock",
108
+ }
109
+ )
110
+
111
+
112
+ def is_dependency_lock(basename: str) -> bool:
113
+ """True for a machine-generated dependency lock file (never a patch target)."""
114
+ return basename.lower() in _DEPENDENCY_LOCK_NAMES
115
+
116
+ # Cap content reads so a pathological file cannot blow up the search.
117
+ _MAX_CONTENT_CHARS = 200_000
118
+
119
+
120
+ @dataclass
121
+ class ImplTargets:
122
+ """Implementation/test files affected by one design document."""
123
+
124
+ design_node_id: str
125
+ impl_paths: list[str] = field(default_factory=list)
126
+ test_paths: list[str] = field(default_factory=list)
127
+ # "expects" (DAG edges), "frontmatter_modules" (glob fallback), "none"
128
+ source: str = "none"
129
+
130
+
131
+ def affected_impl_targets(
132
+ dag: Any,
133
+ design_node_id: str,
134
+ *,
135
+ project_root: Path | None = None,
136
+ ) -> ImplTargets:
137
+ """Resolve implementation and test files affected by ``design_node_id``.
138
+
139
+ Args:
140
+ dag: a built :class:`codd.dag.DAG` (or duck-typed equivalent with
141
+ ``nodes`` mapping and ``edges`` list).
142
+ design_node_id: node id of the design document (relative posix path).
143
+ project_root: required for the frontmatter ``modules`` filesystem
144
+ fallback; when ``None`` the fallback is skipped.
145
+ """
146
+ targets = ImplTargets(design_node_id=design_node_id)
147
+ nodes = getattr(dag, "nodes", {}) or {}
148
+ design_node = nodes.get(design_node_id)
149
+ if design_node is None:
150
+ return targets
151
+
152
+ forward: dict[str, dict[str, list[str]]] = {}
153
+ for edge in getattr(dag, "edges", []) or []:
154
+ forward.setdefault(edge.from_id, {}).setdefault(edge.kind, []).append(edge.to_id)
155
+
156
+ impl_ids: list[str] = []
157
+ seen_impl: set[str] = set()
158
+ for target_id in forward.get(design_node_id, {}).get("expects", []):
159
+ node = nodes.get(target_id)
160
+ if node is None:
161
+ continue
162
+ if node.kind == "expected":
163
+ # Lexicon expected-artifact node: hop through `represents`.
164
+ for represented_id in forward.get(target_id, {}).get("represents", []):
165
+ _append_code_node(nodes.get(represented_id), impl_ids, seen_impl)
166
+ continue
167
+ _append_code_node(node, impl_ids, seen_impl)
168
+
169
+ source = "expects" if impl_ids else "none"
170
+
171
+ if not impl_ids and project_root is not None:
172
+ for module in _frontmatter_modules(design_node):
173
+ for candidate in find_impl_candidates(Path(project_root), str(module)):
174
+ normalized = Path(candidate).as_posix()
175
+ if normalized not in seen_impl:
176
+ seen_impl.add(normalized)
177
+ impl_ids.append(normalized)
178
+ if impl_ids:
179
+ source = "frontmatter_modules"
180
+
181
+ test_ids: list[str] = []
182
+ seen_tests: set[str] = set()
183
+ for impl_id in impl_ids:
184
+ for test_id in forward.get(impl_id, {}).get("tested_by", []):
185
+ node = nodes.get(test_id)
186
+ if node is None:
187
+ continue
188
+ node_path = str(node.path or node.id)
189
+ if node_path.endswith(_DOC_SUFFIX):
190
+ continue
191
+ if test_id not in seen_tests:
192
+ seen_tests.add(test_id)
193
+ test_ids.append(test_id)
194
+
195
+ targets.impl_paths = sorted(impl_ids)
196
+ targets.test_paths = sorted(test_ids)
197
+ targets.source = source
198
+ return targets
199
+
200
+
201
+ def _append_code_node(node: Any, impl_ids: list[str], seen: set[str]) -> None:
202
+ """Collect a node when it represents implementation *code*.
203
+
204
+ ``kind="common"`` is shared by frontmatter-declared common documents and
205
+ ``common_node_patterns``-matched code files; ``.md`` is the codebase-wide
206
+ doc discriminator (same principle as ``dependency_freshness``).
207
+ """
208
+ if node is None:
209
+ return
210
+ node_path = str(node.path or node.id)
211
+ if node.kind == "impl_file" or (node.kind == "common" and not node_path.endswith(_DOC_SUFFIX)):
212
+ path = Path(node_path).as_posix()
213
+ if path not in seen:
214
+ seen.add(path)
215
+ impl_ids.append(path)
216
+
217
+
218
+ def _frontmatter_modules(node: Any) -> list[Any]:
219
+ attributes = getattr(node, "attributes", None) or {}
220
+ frontmatter = attributes.get("frontmatter") or {}
221
+ if not isinstance(frontmatter, dict):
222
+ return []
223
+ modules = frontmatter.get("modules") or []
224
+ if isinstance(modules, (list, tuple)):
225
+ return list(modules)
226
+ return [modules]
227
+
228
+
229
+ # ---------------------------------------------------------------------------
230
+ # Filesystem candidate matching (shared with codd.fixer — behavior-identical)
231
+ # ---------------------------------------------------------------------------
232
+
233
+
234
+ def is_test_path(path: str) -> bool:
235
+ """Check if a path looks like a test file."""
236
+ parts = path.replace("\\", "/").split("/")
237
+ # Directory-based: tests/, __tests__/, test/, spec/
238
+ if any(p in ("tests", "__tests__", "test", "spec") for p in parts):
239
+ return True
240
+ # File-based: *.spec.*, *.test.*, *.e2e.*, test_*
241
+ basename = parts[-1] if parts else ""
242
+ if (
243
+ ".spec." in basename
244
+ or ".test." in basename
245
+ or ".e2e." in basename
246
+ or basename.startswith("test_")
247
+ ):
248
+ return True
249
+ return False
250
+
251
+
252
+ def find_impl_candidates(project_root: Path, domain: str) -> list[str]:
253
+ """Find implementation files matching a domain name."""
254
+ candidates: list[str] = []
255
+ domain_lower = domain.lower().replace("-", "_")
256
+
257
+ # Strategy 1: API route files — **/api/{domain}/route.{ts,js}
258
+ # Handles both standard (src/app/api/) and generated (src/generated/*/app/api/)
259
+ domain_kebab = domain_lower.replace("_", "-")
260
+ for domain_variant in {domain_lower, domain_kebab}:
261
+ for ext in ("ts", "tsx", "js"):
262
+ for match in project_root.glob(f"**/api/{domain_variant}/route.{ext}"):
263
+ if match.is_file():
264
+ rel = str(match.relative_to(project_root))
265
+ if rel not in candidates:
266
+ candidates.append(rel)
267
+
268
+ # Strategy 3: Generated/service files — src/**/domain*.ts
269
+ for pattern in (
270
+ f"src/**/*{domain_lower}*",
271
+ f"src/**/*{domain_kebab}*",
272
+ f"lib/**/*{domain_lower}*",
273
+ ):
274
+ for match in project_root.glob(pattern):
275
+ if match.is_file() and not is_test_path(str(match.relative_to(project_root))):
276
+ rel = str(match.relative_to(project_root))
277
+ if rel not in candidates:
278
+ candidates.append(rel)
279
+
280
+ # Strategy 4: Python — {domain}.py, app.py in same directory
281
+ for pattern in (
282
+ f"**/{domain_lower}.py",
283
+ f"**/app.py",
284
+ f"src/**/{domain_lower}.py",
285
+ ):
286
+ for match in project_root.glob(pattern):
287
+ if match.is_file() and not is_test_path(str(match.relative_to(project_root))):
288
+ rel = str(match.relative_to(project_root))
289
+ if rel not in candidates:
290
+ candidates.append(rel)
291
+
292
+ return candidates
293
+
294
+
295
+ # ---------------------------------------------------------------------------
296
+ # v2 search: term normalization + path-segment + content matching
297
+ #
298
+ # The legacy ``find_impl_candidates`` maps a single *module* name to files via
299
+ # globs. That breaks in brownfield codebases whose design docs link only at a
300
+ # coarse module granularity (a module that actually owns files scattered under
301
+ # unrelated paths). The helpers below let the planner search by the
302
+ # phenomenon's own vocabulary — entities, fields, operations, surfaces —
303
+ # across BOTH path segments and file content, with cheap term normalization so
304
+ # a snake_case token matches its camelCase and kebab-case spellings.
305
+ # Everything is generic: only path/content tokens, never a framework or
306
+ # project name.
307
+ # ---------------------------------------------------------------------------
308
+
309
+ _CAMEL_BOUNDARY_RE = re.compile(r"(?<=[a-z0-9])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])")
310
+ _NON_ALNUM_RE = re.compile(r"[^A-Za-z0-9]+")
311
+ _ASCII_WORD_RE = re.compile(r"[A-Za-z][A-Za-z0-9]*")
312
+
313
+
314
+ def _split_words(term: str) -> list[str]:
315
+ """Split a term into its component words (snake/kebab/camel aware)."""
316
+ if not term:
317
+ return []
318
+ # Normalize separators, then break camelCase boundaries.
319
+ spaced = _NON_ALNUM_RE.sub(" ", term)
320
+ spaced = _CAMEL_BOUNDARY_RE.sub(" ", spaced)
321
+ return [w for w in spaced.split() if w]
322
+
323
+
324
+ def _to_snake(term: str) -> str:
325
+ return "_".join(w.lower() for w in _split_words(term))
326
+
327
+
328
+ def _to_kebab(term: str) -> str:
329
+ return "-".join(w.lower() for w in _split_words(term))
330
+
331
+
332
+ def _to_camel(term: str) -> str:
333
+ words = _split_words(term)
334
+ if not words:
335
+ return ""
336
+ head, *rest = words
337
+ return head.lower() + "".join(w.capitalize() for w in rest)
338
+
339
+
340
+ def _singularize_cheap(word: str) -> str:
341
+ """A deliberately small, language-agnostic singularizer.
342
+
343
+ Handles the common English plural endings only; never claims linguistic
344
+ correctness. Generality > completeness — it must not encode domain words.
345
+ """
346
+ low = word
347
+ if len(low) > 3 and low.endswith("ies"):
348
+ return low[:-3] + "y"
349
+ if len(low) > 4 and low.endswith("ses"):
350
+ return low[:-2]
351
+ if len(low) > 2 and low.endswith("s") and not low.endswith("ss"):
352
+ return low[:-1]
353
+ return low
354
+
355
+
356
+ def _pluralize_cheap(word: str) -> str:
357
+ low = word
358
+ if not low:
359
+ return low
360
+ if low.endswith("y") and len(low) > 1 and low[-2] not in "aeiou":
361
+ return low[:-1] + "ies"
362
+ if low.endswith(("s", "x", "z", "ch", "sh")):
363
+ return low + "es"
364
+ return low + "s"
365
+
366
+
367
+ def normalize_terms(terms: Iterable[str]) -> set[str]:
368
+ """Expand each term into snake/camel/kebab + cheap singular/plural forms.
369
+
370
+ Returns a lowercase set of tokens length >= 2. Both the whole term and its
371
+ singular/plural variants are expanded, so a two-word camelCase term yields
372
+ its snake_case, kebab-case, and concatenated spellings (and their singular
373
+ forms) — letting a phenomenon term match any casing convention in the code.
374
+ """
375
+ out: set[str] = set()
376
+ for raw in terms:
377
+ if not isinstance(raw, str):
378
+ continue
379
+ term = raw.strip()
380
+ if not term:
381
+ continue
382
+
383
+ seeds = {term}
384
+ words = _split_words(term)
385
+ # Singular/plural variants of the last word (e.g. cat <-> cats),
386
+ # rejoined in the original casing forms below.
387
+ if words:
388
+ last = words[-1]
389
+ for variant in (_singularize_cheap(last), _pluralize_cheap(last)):
390
+ if variant and variant != last:
391
+ seeds.add(" ".join(words[:-1] + [variant]))
392
+ # Whole-term singular/plural (covers single-word terms too).
393
+ seeds.add(_singularize_cheap(term))
394
+ seeds.add(_pluralize_cheap(term))
395
+
396
+ for seed in list(seeds):
397
+ for form in (
398
+ seed,
399
+ _to_snake(seed),
400
+ _to_kebab(seed),
401
+ _to_camel(seed),
402
+ seed.replace(" ", "").replace("_", "").replace("-", ""),
403
+ ):
404
+ if form:
405
+ out.add(form.lower())
406
+
407
+ return {tok for tok in out if len(tok) >= 2}
408
+
409
+
410
+ def iter_source_files(
411
+ project_root: Path,
412
+ suffixes: Iterable[str] | None = None,
413
+ ) -> Iterable[Path]:
414
+ """Yield implementation source files under ``project_root``.
415
+
416
+ Skips VCS/build/cache directories and test files. ``suffixes`` defaults to
417
+ :data:`_SOURCE_SUFFIXES`.
418
+ """
419
+ root = Path(project_root)
420
+ allowed = tuple(s.lower() for s in (suffixes or _SOURCE_SUFFIXES))
421
+ for path in sorted(root.rglob("*")):
422
+ if not path.is_file():
423
+ continue
424
+ if path.suffix.lower() not in allowed:
425
+ continue
426
+ rel_parts = path.relative_to(root).parts
427
+ # Skip named build/cache/VCS dirs AND any dotdir (e.g. .next, .next-e2e,
428
+ # .nuxt, .svelte-kit, .turbo, .cache): generated build output and tool
429
+ # caches live under dotdirs and are never hand-edited source. A bare
430
+ # ``part in _SKIP_DIR_NAMES`` misses sibling build dirs like ``.next-e2e``.
431
+ if any(
432
+ part in _SKIP_DIR_NAMES or (part.startswith(".") and part not in (".", ".."))
433
+ for part in rel_parts[:-1]
434
+ ):
435
+ continue
436
+ if is_dependency_lock(rel_parts[-1]):
437
+ continue
438
+ rel = "/".join(rel_parts)
439
+ if is_test_path(rel):
440
+ continue
441
+ yield path
442
+
443
+
444
+ def _safe_read(path: Path) -> str:
445
+ try:
446
+ text = path.read_text(encoding="utf-8")
447
+ except (OSError, UnicodeDecodeError):
448
+ return ""
449
+ if len(text) > _MAX_CONTENT_CHARS:
450
+ return text[:_MAX_CONTENT_CHARS]
451
+ return text
452
+
453
+
454
+ def _rel(path: Path, project_root: Path) -> str:
455
+ return path.relative_to(project_root).as_posix()
456
+
457
+
458
+ @dataclass
459
+ class PathSegmentHit:
460
+ """A normalized term matched against a file's path."""
461
+
462
+ term: str
463
+ where: str # "path_segment" | "path_basename" | "path_substring"
464
+
465
+
466
+ @dataclass
467
+ class ContentHit:
468
+ """A normalized term matched against a file's content."""
469
+
470
+ term: str
471
+
472
+
473
+ def path_segment_hits(rel_path: str, terms: set[str]) -> list[PathSegmentHit]:
474
+ """Match normalized ``terms`` against the segments of ``rel_path``.
475
+
476
+ Strongest signal first: a whole path segment equals a term, then the
477
+ basename contains it, then any segment contains it as a substring.
478
+ """
479
+ parts = [p.lower() for p in rel_path.replace("\\", "/").split("/") if p]
480
+ if not parts:
481
+ return []
482
+ basename = parts[-1]
483
+ # Also expose extension-stripped basename tokens for equality checks.
484
+ stem = basename.rsplit(".", 1)[0] if "." in basename else basename
485
+ segment_set = set(parts) | {stem}
486
+
487
+ hits: list[PathSegmentHit] = []
488
+ for term in terms:
489
+ if term in segment_set:
490
+ hits.append(PathSegmentHit(term=term, where="path_segment"))
491
+ elif term in basename:
492
+ hits.append(PathSegmentHit(term=term, where="path_basename"))
493
+ elif any(term in part for part in parts):
494
+ hits.append(PathSegmentHit(term=term, where="path_substring"))
495
+ return hits
496
+
497
+
498
+ def content_hits(text: str, terms: set[str]) -> list[ContentHit]:
499
+ """Match normalized ``terms`` against lowercased file ``text``."""
500
+ if not text:
501
+ return []
502
+ low = text.lower()
503
+ return [ContentHit(term=term) for term in terms if term in low]
504
+
505
+
506
+ def find_impl_candidates_v2(
507
+ project_root: Path,
508
+ terms: set[str],
509
+ *,
510
+ suffixes: Iterable[str] | None = None,
511
+ candidate_paths: Iterable[str] | None = None,
512
+ ) -> dict[str, dict[str, Any]]:
513
+ """Search every source file for ``terms`` in both path and content.
514
+
515
+ Returns ``{rel_path: {"path_hits": [...], "content_hits": [...]}}`` for
516
+ files with at least one hit. The planner — not this function — decides
517
+ which of these become write targets, based on evidence scoring. Keeping
518
+ discovery (broad) separate from acceptance (strict) is what lets recall be
519
+ high without sacrificing precision.
520
+
521
+ The candidate universe is general:
522
+
523
+ * ``candidate_paths`` (explicit rel-path list) takes precedence when given —
524
+ the caller has already chosen the source universe (e.g. DAG nodes);
525
+ * otherwise :func:`iter_source_files` walks the tree filtered by
526
+ ``suffixes`` (defaulting to :data:`_SOURCE_SUFFIXES`), skipping
527
+ VCS/build/cache dirs and test files.
528
+
529
+ Passing a non-default ``suffixes`` (e.g. the set of text-like extensions a
530
+ repo actually contains) makes stylesheet/text-config/copy files discoverable
531
+ WITHOUT this function hardcoding any framework suffix — generality is kept by
532
+ deriving the universe from the repo, not from a baked-in list.
533
+ """
534
+ root = Path(project_root)
535
+ norm = {t for t in terms if t}
536
+ out: dict[str, dict[str, Any]] = {}
537
+ if not norm:
538
+ return out
539
+
540
+ if candidate_paths is not None:
541
+ paths_iter: Iterable[Path] = []
542
+ seen: set[str] = set()
543
+ resolved: list[Path] = []
544
+ for rel in candidate_paths:
545
+ rel_posix = Path(rel).as_posix()
546
+ if rel_posix in seen:
547
+ continue
548
+ seen.add(rel_posix)
549
+ full = root / rel
550
+ if full.is_file():
551
+ resolved.append(full)
552
+ paths_iter = resolved
553
+ else:
554
+ paths_iter = iter_source_files(root, suffixes)
555
+
556
+ for path in paths_iter:
557
+ rel = _rel(path, root)
558
+ p_hits = path_segment_hits(rel, norm)
559
+ text = _safe_read(path)
560
+ c_hits = content_hits(text, norm)
561
+ if p_hits or c_hits:
562
+ out[rel] = {"path_hits": p_hits, "content_hits": c_hits}
563
+ return out
@@ -128,11 +128,28 @@ def select_candidates(
128
128
  )
129
129
 
130
130
 
131
+ def _is_markdown_doc_node(node: Node) -> bool:
132
+ """True only for markdown design documents.
133
+
134
+ ``kind="common"`` is overloaded: the DAG builder marks BOTH common design
135
+ *documents* and common *code* files (those matching ``common_node_patterns``)
136
+ as ``common``. Only markdown docs are valid Stage-3 design-update targets —
137
+ admitting common *code* here lets a phenomenon fix rewrite an implementation
138
+ file as if it were a design document, collapsing the design→impl→test north
139
+ star into a single ad-hoc code edit.
140
+ """
141
+ path = str(node.path or node.id or "")
142
+ return path.endswith(".md")
143
+
144
+
131
145
  def _collect_design_nodes(dag: DAG, *, include_common: bool) -> list[Node]:
132
- kinds = {"design_doc"}
133
- if include_common:
134
- kinds.add("common")
135
- return [node for node in dag.nodes.values() if node.kind in kinds]
146
+ out: list[Node] = []
147
+ for node in dag.nodes.values():
148
+ if node.kind == "design_doc":
149
+ out.append(node)
150
+ elif include_common and node.kind == "common" and _is_markdown_doc_node(node):
151
+ out.append(node)
152
+ return out
136
153
 
137
154
 
138
155
  _WORD_RE = re.compile(r"[A-Za-z_][A-Za-z0-9_]+|[぀-ヿ一-鿿]+")