codd-dev 2.6.1__tar.gz → 2.8.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 (424) hide show
  1. {codd_dev-2.6.1 → codd_dev-2.8.0}/PKG-INFO +1 -1
  2. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/cli.py +102 -2
  3. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/elicit/engine.py +9 -4
  4. codd_dev-2.8.0/codd/init/llm_lexicon_suggester.py +234 -0
  5. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/lexicon.py +5 -1
  6. {codd_dev-2.6.1 → codd_dev-2.8.0}/pyproject.toml +1 -1
  7. {codd_dev-2.6.1 → codd_dev-2.8.0}/.gitignore +0 -0
  8. {codd_dev-2.6.1 → codd_dev-2.8.0}/LICENSE +0 -0
  9. {codd_dev-2.6.1 → codd_dev-2.8.0}/README.md +0 -0
  10. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/__init__.py +0 -0
  11. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/__main__.py +0 -0
  12. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/_git_helper.py +0 -0
  13. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/ask_user_question_adapter.py +0 -0
  14. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/assembler.py +0 -0
  15. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/bridge.py +0 -0
  16. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/brownfield/__init__.py +0 -0
  17. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/brownfield/pipeline.py +0 -0
  18. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/clustering.py +0 -0
  19. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/coherence_adapters.py +0 -0
  20. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/coherence_engine.py +0 -0
  21. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/config.py +0 -0
  22. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/contracts.py +0 -0
  23. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/coverage_auditor.py +0 -0
  24. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/coverage_metrics.py +0 -0
  25. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/dag/__init__.py +0 -0
  26. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/dag/builder.py +0 -0
  27. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/dag/checks/__init__.py +0 -0
  28. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/dag/checks/depends_on_consistency.py +0 -0
  29. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/dag/checks/deployment_completeness.py +0 -0
  30. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/dag/checks/edge_validity.py +0 -0
  31. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/dag/checks/environment_coverage.py +0 -0
  32. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/dag/checks/implementation_coverage.py +0 -0
  33. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/dag/checks/node_completeness.py +0 -0
  34. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/dag/checks/task_completion.py +0 -0
  35. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/dag/checks/transitive_closure.py +0 -0
  36. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/dag/checks/user_journey_coherence.py +0 -0
  37. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/dag/coverage_axes.py +0 -0
  38. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/dag/defaults/cli.yaml +0 -0
  39. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/dag/defaults/cpp_embedded.yaml +0 -0
  40. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/dag/defaults/csharp.yaml +0 -0
  41. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/dag/defaults/elixir.yaml +0 -0
  42. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/dag/defaults/generic.yaml +0 -0
  43. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/dag/defaults/iot.yaml +0 -0
  44. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/dag/defaults/java.yaml +0 -0
  45. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/dag/defaults/kotlin.yaml +0 -0
  46. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/dag/defaults/mobile.yaml +0 -0
  47. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/dag/defaults/ruby.yaml +0 -0
  48. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/dag/defaults/rust.yaml +0 -0
  49. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/dag/defaults/scala.yaml +0 -0
  50. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/dag/defaults/swift.yaml +0 -0
  51. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/dag/defaults/test_frameworks.yaml +0 -0
  52. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/dag/defaults/web.yaml +0 -0
  53. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/dag/extractor.py +0 -0
  54. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/dag/runner.py +0 -0
  55. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/defaults.yaml +0 -0
  56. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/deploy_targets/__init__.py +0 -0
  57. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/deploy_targets/app_service.py +0 -0
  58. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/deploy_targets/base.py +0 -0
  59. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/deploy_targets/docker_compose.py +0 -0
  60. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/deployer.py +0 -0
  61. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/deployment/__init__.py +0 -0
  62. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/deployment/checks/__init__.py +0 -0
  63. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/deployment/defaults/deploy_targets.yaml +0 -0
  64. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/deployment/defaults/runtime_capability_inference.yaml +0 -0
  65. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/deployment/defaults/schema_providers.yaml +0 -0
  66. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/deployment/defaults/verification_templates.yaml +0 -0
  67. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/deployment/extractor.py +0 -0
  68. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/deployment/providers/__init__.py +0 -0
  69. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/deployment/providers/ai_command.py +0 -0
  70. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/deployment/providers/llm_consideration.py +0 -0
  71. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/deployment/providers/schema/__init__.py +0 -0
  72. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/deployment/providers/schema/prisma.py +0 -0
  73. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/deployment/providers/target/__init__.py +0 -0
  74. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/deployment/providers/target/docker_compose.py +0 -0
  75. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/deployment/providers/verification/__init__.py +0 -0
  76. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/deployment/providers/verification/assertion_handlers.py +0 -0
  77. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/deployment/providers/verification/cdp_browser.py +0 -0
  78. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/deployment/providers/verification/cdp_engines.py +0 -0
  79. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/deployment/providers/verification/cdp_launchers.py +0 -0
  80. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/deployment/providers/verification/cdp_wire.py +0 -0
  81. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/deployment/providers/verification/curl.py +0 -0
  82. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/deployment/providers/verification/form_strategies.py +0 -0
  83. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/deployment/providers/verification/means_catalog.py +0 -0
  84. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/deployment/providers/verification/playwright.py +0 -0
  85. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/design_md.py +0 -0
  86. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/diff/__init__.py +0 -0
  87. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/diff/apply.py +0 -0
  88. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/diff/engine.py +0 -0
  89. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/diff/persistence.py +0 -0
  90. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/diff/templates/diff_prompt.md +0 -0
  91. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/drift.py +0 -0
  92. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/e2e_extractor.py +0 -0
  93. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/e2e_generator.py +0 -0
  94. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/e2e_runner.py +0 -0
  95. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/elicit/__init__.py +0 -0
  96. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/elicit/apply.py +0 -0
  97. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/elicit/finding.py +0 -0
  98. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/elicit/formatters/__init__.py +0 -0
  99. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/elicit/formatters/base.py +0 -0
  100. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/elicit/formatters/interactive.py +0 -0
  101. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/elicit/formatters/json_fmt.py +0 -0
  102. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/elicit/formatters/md.py +0 -0
  103. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/elicit/lexicon_loader.py +0 -0
  104. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/elicit/persistence.py +0 -0
  105. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/elicit/templates/elicit_prompt_L0.md +0 -0
  106. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/env_refs.py +0 -0
  107. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/extract_ai.py +0 -0
  108. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/extractor.py +0 -0
  109. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/fixer.py +0 -0
  110. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/fixup_drift.py +0 -0
  111. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/fixup_drift_strategies/__init__.py +0 -0
  112. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/fixup_drift_strategies/design_token_drift.py +0 -0
  113. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/fixup_drift_strategies/lexicon_violation.py +0 -0
  114. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/fixup_drift_strategies/url_drift.py +0 -0
  115. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/generator.py +0 -0
  116. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/graph.py +0 -0
  117. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/hitl_session.py +0 -0
  118. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/hooks/__init__.py +0 -0
  119. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/hooks/pre-commit +0 -0
  120. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/hooks/recipes/claude_settings_example.json +0 -0
  121. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/hooks/recipes/codex_hook.sh +0 -0
  122. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/hooks/recipes/git_post_commit.sh +0 -0
  123. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/hooks/recipes/git_pre_commit.sh +0 -0
  124. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/implementer/__init__.py +0 -0
  125. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/implementer/chunked_runner.py +0 -0
  126. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/implementer/typecheck_loop.py +0 -0
  127. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/implementer.py +0 -0
  128. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/inheritance.py +0 -0
  129. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/init/__init__.py +0 -0
  130. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/init/lexicon_suggest.py +0 -0
  131. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/init/stack_detector.py +0 -0
  132. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/knowledge_fetcher.py +0 -0
  133. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/lexicon_cli/__init__.py +0 -0
  134. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/lexicon_cli/formatters/__init__.py +0 -0
  135. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/lexicon_cli/formatters/html.py +0 -0
  136. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/lexicon_cli/formatters/json_fmt.py +0 -0
  137. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/lexicon_cli/formatters/md.py +0 -0
  138. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/lexicon_cli/inspector.py +0 -0
  139. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/lexicon_cli/manager.py +0 -0
  140. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/lexicon_cli/reporter.py +0 -0
  141. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/lexicon_cli/threshold.py +0 -0
  142. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/llm/__init__.py +0 -0
  143. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/llm/approval.py +0 -0
  144. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/llm/best_practice_augmenter.py +0 -0
  145. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/llm/criteria_expander.py +0 -0
  146. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/llm/design_doc_extractor.py +0 -0
  147. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/llm/impl_step_deriver.py +0 -0
  148. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/llm/means_catalog_loader.py +0 -0
  149. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/llm/parser.py +0 -0
  150. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/llm/plan_deriver.py +0 -0
  151. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/llm/prompt_builder.py +0 -0
  152. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/llm/strategy_validator.py +0 -0
  153. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/llm/templates/best_practice_augment_meta.md +0 -0
  154. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/llm/templates/criteria_expand_meta.md +0 -0
  155. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/llm/templates/design_doc_extract_meta.md +0 -0
  156. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/llm/templates/impl_step_derive_meta.md +0 -0
  157. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/llm/templates/implementation_step_catalog.yaml +0 -0
  158. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/llm/templates/meta_instruction.md +0 -0
  159. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/llm/templates/plan_derive_meta.md +0 -0
  160. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/llm/templates/verification_means_catalog.yaml +0 -0
  161. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/mcp_server.py +0 -0
  162. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/measure.py +0 -0
  163. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/parsing.py +0 -0
  164. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/planner.py +0 -0
  165. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/policy.py +0 -0
  166. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/preflight/__init__.py +0 -0
  167. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/preflight/defaults/cli.yaml +0 -0
  168. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/preflight/defaults/iot.yaml +0 -0
  169. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/preflight/defaults/mobile.yaml +0 -0
  170. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/preflight/defaults/web.yaml +0 -0
  171. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/propagate.py +0 -0
  172. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/propagator.py +0 -0
  173. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/registry.py +0 -0
  174. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/repair/__init__.py +0 -0
  175. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/repair/approval_repair.py +0 -0
  176. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/repair/engine.py +0 -0
  177. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/repair/git_patcher.py +0 -0
  178. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/repair/history.py +0 -0
  179. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/repair/llm_repair_engine.py +0 -0
  180. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/repair/loop.py +0 -0
  181. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/repair/primary_picker.py +0 -0
  182. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/repair/proof_breaks.py +0 -0
  183. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/repair/repair_result.py +0 -0
  184. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/repair/repairability_classifier.py +0 -0
  185. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/repair/schema.py +0 -0
  186. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/repair/templates/analyze_meta.md +0 -0
  187. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/repair/templates/propose_meta.md +0 -0
  188. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/repair/templates/repair_strategy_meta.md +0 -0
  189. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/repair/templates/repairability_meta.md +0 -0
  190. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/repair/verify_runner.py +0 -0
  191. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/repair_slice.py +0 -0
  192. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/require.py +0 -0
  193. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/require_plugins.py +0 -0
  194. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/require_propagate.py +0 -0
  195. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/required_artifacts/defaults/cli.yaml +0 -0
  196. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/required_artifacts/defaults/iot.yaml +0 -0
  197. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/required_artifacts/defaults/mobile.yaml +0 -0
  198. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/required_artifacts/defaults/web.yaml +0 -0
  199. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/required_artifacts_deriver.py +0 -0
  200. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/requirement_completeness/defaults/cli.yaml +0 -0
  201. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/requirement_completeness/defaults/iot.yaml +0 -0
  202. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/requirement_completeness/defaults/mobile.yaml +0 -0
  203. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/requirement_completeness/defaults/web.yaml +0 -0
  204. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/requirement_completeness_auditor.py +0 -0
  205. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/restore.py +0 -0
  206. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/routes_extractor.py +0 -0
  207. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/scanner.py +0 -0
  208. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/schema_refs.py +0 -0
  209. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/screen_flow_validator.py +0 -0
  210. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/screen_transition_extractor.py +0 -0
  211. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/screen_transitions/defaults.yaml +0 -0
  212. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/synth.py +0 -0
  213. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/templates/codd.yaml.tmpl +0 -0
  214. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/templates/conventions.yaml.tmpl +0 -0
  215. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/templates/data_dependencies.yaml.tmpl +0 -0
  216. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/templates/doc_links.yaml.tmpl +0 -0
  217. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/templates/extract_ai_prompt_baseline.md +0 -0
  218. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/templates/extracted/api-contract.md.j2 +0 -0
  219. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/templates/extracted/architecture-overview.md.j2 +0 -0
  220. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/templates/extracted/module-detail.md.j2 +0 -0
  221. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/templates/extracted/schema-design.md.j2 +0 -0
  222. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/templates/extracted/system-context.md.j2 +0 -0
  223. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/templates/gitignore.tmpl +0 -0
  224. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/templates/lexicon_questions.md +0 -0
  225. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/templates/lexicon_schema.yaml +0 -0
  226. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/templates/overrides.yaml.tmpl +0 -0
  227. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/traceability.py +0 -0
  228. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/validator.py +0 -0
  229. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/watch/__init__.py +0 -0
  230. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/watch/events.py +0 -0
  231. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/watch/propagation_log.py +0 -0
  232. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/watch/propagation_pipeline.py +0 -0
  233. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/watch/test_runner.py +0 -0
  234. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/watch/watcher.py +0 -0
  235. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/wiring.py +0 -0
  236. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/ai_governance_eu_act/coverage_matrix.md +0 -0
  237. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/ai_governance_eu_act/elicit_extend.md +0 -0
  238. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/ai_governance_eu_act/lexicon.yaml +0 -0
  239. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/ai_governance_eu_act/manifest.yaml +0 -0
  240. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/ai_governance_eu_act/recommended_kinds.yaml +0 -0
  241. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/ai_governance_eu_act/severity_rules.yaml +0 -0
  242. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/api_rest_openapi/coverage_matrix.md +0 -0
  243. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/api_rest_openapi/elicit_extend.md +0 -0
  244. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/api_rest_openapi/lexicon.yaml +0 -0
  245. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/api_rest_openapi/manifest.yaml +0 -0
  246. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/api_rest_openapi/recommended_kinds.yaml +0 -0
  247. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/api_rest_openapi/severity_rules.yaml +0 -0
  248. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/babok/elicit_extend.md +0 -0
  249. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/babok/lexicon.yaml +0 -0
  250. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/babok/manifest.yaml +0 -0
  251. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/babok/recommended_kinds.yaml +0 -0
  252. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/babok/severity_rules.yaml +0 -0
  253. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/backend_event_cloudevents/coverage_matrix.md +0 -0
  254. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/backend_event_cloudevents/elicit_extend.md +0 -0
  255. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/backend_event_cloudevents/lexicon.yaml +0 -0
  256. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/backend_event_cloudevents/manifest.yaml +0 -0
  257. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/backend_event_cloudevents/recommended_kinds.yaml +0 -0
  258. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/backend_event_cloudevents/severity_rules.yaml +0 -0
  259. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/backend_graphql/coverage_matrix.md +0 -0
  260. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/backend_graphql/elicit_extend.md +0 -0
  261. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/backend_graphql/lexicon.yaml +0 -0
  262. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/backend_graphql/manifest.yaml +0 -0
  263. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/backend_graphql/recommended_kinds.yaml +0 -0
  264. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/backend_graphql/severity_rules.yaml +0 -0
  265. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/backend_grpc_proto/coverage_matrix.md +0 -0
  266. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/backend_grpc_proto/elicit_extend.md +0 -0
  267. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/backend_grpc_proto/lexicon.yaml +0 -0
  268. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/backend_grpc_proto/manifest.yaml +0 -0
  269. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/backend_grpc_proto/recommended_kinds.yaml +0 -0
  270. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/backend_grpc_proto/severity_rules.yaml +0 -0
  271. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/compliance_hipaa/coverage_matrix.md +0 -0
  272. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/compliance_hipaa/elicit_extend.md +0 -0
  273. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/compliance_hipaa/lexicon.yaml +0 -0
  274. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/compliance_hipaa/manifest.yaml +0 -0
  275. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/compliance_hipaa/recommended_kinds.yaml +0 -0
  276. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/compliance_hipaa/severity_rules.yaml +0 -0
  277. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/compliance_iso27001/coverage_matrix.md +0 -0
  278. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/compliance_iso27001/elicit_extend.md +0 -0
  279. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/compliance_iso27001/lexicon.yaml +0 -0
  280. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/compliance_iso27001/manifest.yaml +0 -0
  281. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/compliance_iso27001/recommended_kinds.yaml +0 -0
  282. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/compliance_iso27001/severity_rules.yaml +0 -0
  283. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/compliance_pci_dss_4/coverage_matrix.md +0 -0
  284. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/compliance_pci_dss_4/elicit_extend.md +0 -0
  285. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/compliance_pci_dss_4/lexicon.yaml +0 -0
  286. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/compliance_pci_dss_4/manifest.yaml +0 -0
  287. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/compliance_pci_dss_4/recommended_kinds.yaml +0 -0
  288. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/compliance_pci_dss_4/severity_rules.yaml +0 -0
  289. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/coverage_matrix.md +0 -0
  290. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/elicit_extend.md +0 -0
  291. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/lexicon.yaml +0 -0
  292. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/manifest.yaml +0 -0
  293. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/recommended_kinds.yaml +0 -0
  294. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/severity_rules.yaml +0 -0
  295. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/data_governance_appi_gdpr/coverage_matrix.md +0 -0
  296. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/data_governance_appi_gdpr/elicit_extend.md +0 -0
  297. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/data_governance_appi_gdpr/lexicon.yaml +0 -0
  298. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/data_governance_appi_gdpr/manifest.yaml +0 -0
  299. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/data_governance_appi_gdpr/recommended_kinds.yaml +0 -0
  300. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/data_governance_appi_gdpr/severity_rules.yaml +0 -0
  301. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/data_nosql_jsonschema/coverage_matrix.md +0 -0
  302. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/data_nosql_jsonschema/elicit_extend.md +0 -0
  303. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/data_nosql_jsonschema/lexicon.yaml +0 -0
  304. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/data_nosql_jsonschema/manifest.yaml +0 -0
  305. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/data_nosql_jsonschema/recommended_kinds.yaml +0 -0
  306. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/data_nosql_jsonschema/severity_rules.yaml +0 -0
  307. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/data_relational_iso_sql/coverage_matrix.md +0 -0
  308. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/data_relational_iso_sql/elicit_extend.md +0 -0
  309. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/data_relational_iso_sql/lexicon.yaml +0 -0
  310. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/data_relational_iso_sql/manifest.yaml +0 -0
  311. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/data_relational_iso_sql/recommended_kinds.yaml +0 -0
  312. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/data_relational_iso_sql/severity_rules.yaml +0 -0
  313. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/mobile_a11y_native/coverage_matrix.md +0 -0
  314. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/mobile_a11y_native/elicit_extend.md +0 -0
  315. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/mobile_a11y_native/lexicon.yaml +0 -0
  316. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/mobile_a11y_native/manifest.yaml +0 -0
  317. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/mobile_a11y_native/recommended_kinds.yaml +0 -0
  318. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/mobile_a11y_native/severity_rules.yaml +0 -0
  319. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/mobile_android_material3/coverage_matrix.md +0 -0
  320. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/mobile_android_material3/elicit_extend.md +0 -0
  321. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/mobile_android_material3/lexicon.yaml +0 -0
  322. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/mobile_android_material3/manifest.yaml +0 -0
  323. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/mobile_android_material3/recommended_kinds.yaml +0 -0
  324. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/mobile_android_material3/severity_rules.yaml +0 -0
  325. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/mobile_ios_hig/coverage_matrix.md +0 -0
  326. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/mobile_ios_hig/elicit_extend.md +0 -0
  327. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/mobile_ios_hig/lexicon.yaml +0 -0
  328. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/mobile_ios_hig/manifest.yaml +0 -0
  329. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/mobile_ios_hig/recommended_kinds.yaml +0 -0
  330. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/mobile_ios_hig/severity_rules.yaml +0 -0
  331. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/ops_cicd_pipeline/coverage_matrix.md +0 -0
  332. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/ops_cicd_pipeline/elicit_extend.md +0 -0
  333. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/ops_cicd_pipeline/lexicon.yaml +0 -0
  334. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/ops_cicd_pipeline/manifest.yaml +0 -0
  335. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/ops_cicd_pipeline/recommended_kinds.yaml +0 -0
  336. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/ops_cicd_pipeline/severity_rules.yaml +0 -0
  337. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/ops_iac_terraform/coverage_matrix.md +0 -0
  338. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/ops_iac_terraform/elicit_extend.md +0 -0
  339. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/ops_iac_terraform/lexicon.yaml +0 -0
  340. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/ops_iac_terraform/manifest.yaml +0 -0
  341. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/ops_iac_terraform/recommended_kinds.yaml +0 -0
  342. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/ops_iac_terraform/severity_rules.yaml +0 -0
  343. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/ops_kubernetes/coverage_matrix.md +0 -0
  344. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/ops_kubernetes/elicit_extend.md +0 -0
  345. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/ops_kubernetes/lexicon.yaml +0 -0
  346. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/ops_kubernetes/manifest.yaml +0 -0
  347. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/ops_kubernetes/recommended_kinds.yaml +0 -0
  348. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/ops_kubernetes/severity_rules.yaml +0 -0
  349. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/ops_observability_otel/coverage_matrix.md +0 -0
  350. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/ops_observability_otel/elicit_extend.md +0 -0
  351. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/ops_observability_otel/lexicon.yaml +0 -0
  352. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/ops_observability_otel/manifest.yaml +0 -0
  353. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/ops_observability_otel/recommended_kinds.yaml +0 -0
  354. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/ops_observability_otel/severity_rules.yaml +0 -0
  355. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/process_iso25010/coverage_matrix.md +0 -0
  356. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/process_iso25010/elicit_extend.md +0 -0
  357. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/process_iso25010/lexicon.yaml +0 -0
  358. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/process_iso25010/manifest.yaml +0 -0
  359. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/process_iso25010/recommended_kinds.yaml +0 -0
  360. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/process_iso25010/severity_rules.yaml +0 -0
  361. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/process_test_iso29119/coverage_matrix.md +0 -0
  362. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/process_test_iso29119/elicit_extend.md +0 -0
  363. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/process_test_iso29119/lexicon.yaml +0 -0
  364. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/process_test_iso29119/manifest.yaml +0 -0
  365. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/process_test_iso29119/recommended_kinds.yaml +0 -0
  366. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/process_test_iso29119/severity_rules.yaml +0 -0
  367. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/coverage_matrix.md +0 -0
  368. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/elicit_extend.md +0 -0
  369. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/lexicon.yaml +0 -0
  370. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/manifest.yaml +0 -0
  371. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/recommended_kinds.yaml +0 -0
  372. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/severity_rules.yaml +0 -0
  373. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_authn_webauthn/coverage_matrix.md +0 -0
  374. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_authn_webauthn/elicit_extend.md +0 -0
  375. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_authn_webauthn/lexicon.yaml +0 -0
  376. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_authn_webauthn/manifest.yaml +0 -0
  377. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_authn_webauthn/recommended_kinds.yaml +0 -0
  378. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_authn_webauthn/severity_rules.yaml +0 -0
  379. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_browser_compat/coverage_matrix.md +0 -0
  380. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_browser_compat/elicit_extend.md +0 -0
  381. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_browser_compat/lexicon.yaml +0 -0
  382. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_browser_compat/manifest.yaml +0 -0
  383. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_browser_compat/recommended_kinds.yaml +0 -0
  384. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_browser_compat/severity_rules.yaml +0 -0
  385. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_forms_html5/coverage_matrix.md +0 -0
  386. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_forms_html5/elicit_extend.md +0 -0
  387. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_forms_html5/lexicon.yaml +0 -0
  388. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_forms_html5/manifest.yaml +0 -0
  389. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_forms_html5/recommended_kinds.yaml +0 -0
  390. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_forms_html5/severity_rules.yaml +0 -0
  391. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_performance_core_web_vitals/coverage_matrix.md +0 -0
  392. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_performance_core_web_vitals/elicit_extend.md +0 -0
  393. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_performance_core_web_vitals/lexicon.yaml +0 -0
  394. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_performance_core_web_vitals/manifest.yaml +0 -0
  395. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_performance_core_web_vitals/recommended_kinds.yaml +0 -0
  396. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_performance_core_web_vitals/severity_rules.yaml +0 -0
  397. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_pwa_manifest/coverage_matrix.md +0 -0
  398. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_pwa_manifest/elicit_extend.md +0 -0
  399. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_pwa_manifest/lexicon.yaml +0 -0
  400. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_pwa_manifest/manifest.yaml +0 -0
  401. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_pwa_manifest/recommended_kinds.yaml +0 -0
  402. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_pwa_manifest/severity_rules.yaml +0 -0
  403. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_responsive/coverage_matrix.md +0 -0
  404. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_responsive/elicit_extend.md +0 -0
  405. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_responsive/lexicon.yaml +0 -0
  406. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_responsive/manifest.yaml +0 -0
  407. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_responsive/recommended_kinds.yaml +0 -0
  408. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_responsive/severity_rules.yaml +0 -0
  409. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_security_owasp/coverage_matrix.md +0 -0
  410. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_security_owasp/elicit_extend.md +0 -0
  411. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_security_owasp/lexicon.yaml +0 -0
  412. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_security_owasp/manifest.yaml +0 -0
  413. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_security_owasp/recommended_kinds.yaml +0 -0
  414. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_security_owasp/severity_rules.yaml +0 -0
  415. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_seo_schemaorg/coverage_matrix.md +0 -0
  416. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_seo_schemaorg/elicit_extend.md +0 -0
  417. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_seo_schemaorg/lexicon.yaml +0 -0
  418. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_seo_schemaorg/manifest.yaml +0 -0
  419. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_seo_schemaorg/recommended_kinds.yaml +0 -0
  420. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_seo_schemaorg/severity_rules.yaml +0 -0
  421. {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/stack_map.yaml +0 -0
  422. {codd_dev-2.6.1 → codd_dev-2.8.0}/docs/cookbook/cdp_browser/README.md +0 -0
  423. {codd_dev-2.6.1 → codd_dev-2.8.0}/docs/requirements/README.md +0 -0
  424. {codd_dev-2.6.1 → codd_dev-2.8.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: 2.6.1
3
+ Version: 2.8.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
@@ -463,6 +463,18 @@ def _format_preflight_ntfy(result: Any) -> str:
463
463
  default=True,
464
464
  help="Detect project manifests and offer lexicon plug-in suggestions.",
465
465
  )
466
+ @click.option(
467
+ "--llm-enhanced",
468
+ is_flag=True,
469
+ default=False,
470
+ help="Use AI to recommend lexicons from requirements and design context.",
471
+ )
472
+ @click.option(
473
+ "--auto-approve",
474
+ is_flag=True,
475
+ default=False,
476
+ help="Apply high and medium confidence AI lexicon recommendations without prompting.",
477
+ )
466
478
  def init(
467
479
  project_name: str,
468
480
  language: str,
@@ -470,6 +482,8 @@ def init(
470
482
  requirements: str | None,
471
483
  config_dir: str,
472
484
  suggest_lexicons: bool,
485
+ llm_enhanced: bool,
486
+ auto_approve: bool,
473
487
  ):
474
488
  """Initialize CoDD in a project directory."""
475
489
  dest_path = Path(dest).resolve()
@@ -521,10 +535,15 @@ def init(
521
535
  click.echo(f" or: codd generate --wave 2 (auto-generates everything)")
522
536
 
523
537
  if suggest_lexicons:
524
- _offer_lexicon_suggestions(dest_path)
538
+ _offer_lexicon_suggestions(dest_path, llm_enhanced=llm_enhanced, auto_approve=auto_approve)
525
539
 
526
540
 
527
- def _offer_lexicon_suggestions(project_root: Path) -> None:
541
+ def _offer_lexicon_suggestions(
542
+ project_root: Path,
543
+ *,
544
+ llm_enhanced: bool = False,
545
+ auto_approve: bool = False,
546
+ ) -> None:
528
547
  from codd.init.lexicon_suggest import (
529
548
  append_suggested_lexicons,
530
549
  describe_lexicons,
@@ -533,6 +552,42 @@ def _offer_lexicon_suggestions(project_root: Path) -> None:
533
552
  )
534
553
  from codd.init.stack_detector import StackDetector
535
554
 
555
+ if llm_enhanced:
556
+ from codd.init.llm_lexicon_suggester import llm_recommend_lexicons
557
+
558
+ llm_result = llm_recommend_lexicons(project_root)
559
+ if llm_result.recommendations:
560
+ descriptions = describe_lexicons(rec.lexicon_id for rec in llm_result.recommendations)
561
+ click.echo("")
562
+ click.echo("[LLM-enhanced] Analyzing project ...")
563
+ click.echo("[LLM-enhanced] Detected:")
564
+ click.echo(f" - Domain: {llm_result.detected_domain or 'unknown'}")
565
+ click.echo(f" - Compliance: {_format_detected_items(llm_result.detected_compliance)}")
566
+ click.echo(f" - Tech stack: {_format_detected_items(llm_result.detected_tech_stack)}")
567
+ click.echo(f" - Integrations: {_format_detected_items(llm_result.detected_integrations)}")
568
+ click.echo("")
569
+ click.echo("[LLM-enhanced] Recommended lexicons:")
570
+ for index, recommendation in enumerate(llm_result.recommendations, start=1):
571
+ description = descriptions.get(recommendation.lexicon_id, "")
572
+ suffix = f" ({description})" if description else ""
573
+ click.echo(
574
+ f" {index}. {_confidence_icon(recommendation.confidence)} "
575
+ f"{recommendation.lexicon_id}{suffix} [{recommendation.confidence}]"
576
+ )
577
+ if recommendation.reason:
578
+ click.echo(f" {recommendation.reason}")
579
+
580
+ selected = _select_llm_recommendations(llm_result, auto_approve=auto_approve)
581
+ if not selected:
582
+ click.echo("LLM-enhanced lexicons not added.")
583
+ return
584
+ path = append_suggested_lexicons(project_root, selected)
585
+ rel_path = path.relative_to(project_root).as_posix()
586
+ click.echo(f"{rel_path} updated ({len(selected)} suggested lexicons)")
587
+ return
588
+ click.echo("")
589
+ click.echo("[LLM-enhanced] No usable recommendation; falling back to stack-based suggestions.")
590
+
536
591
  detection = StackDetector().detect(project_root)
537
592
  if not detection.stack_hints:
538
593
  return
@@ -559,6 +614,51 @@ def _offer_lexicon_suggestions(project_root: Path) -> None:
559
614
  click.echo(f"{rel_path} updated ({len(suggestions)} suggested lexicons)")
560
615
 
561
616
 
617
+ def _format_detected_items(items: list[str]) -> str:
618
+ return ", ".join(items) if items else "none"
619
+
620
+
621
+ def _confidence_icon(confidence: str) -> str:
622
+ return {"high": "✅", "medium": "⚠️", "low": "△"}.get(confidence, "△")
623
+
624
+
625
+ def _select_llm_recommendations(llm_result: Any, *, auto_approve: bool) -> list[str]:
626
+ if auto_approve:
627
+ return [
628
+ recommendation.lexicon_id
629
+ for recommendation in llm_result.recommendations
630
+ if recommendation.confidence in {"high", "medium"}
631
+ ]
632
+
633
+ choice = click.prompt("Apply all recommended? [Y/n/select]", default="Y", show_default=False).strip().lower()
634
+ if choice in {"y", "yes", ""}:
635
+ return [
636
+ recommendation.lexicon_id
637
+ for recommendation in llm_result.recommendations
638
+ if recommendation.confidence in {"high", "medium"}
639
+ ]
640
+ if choice in {"n", "no"}:
641
+ return []
642
+ if choice != "select":
643
+ click.echo("Invalid selection; suggested lexicons not added.")
644
+ return []
645
+
646
+ raw_numbers = click.prompt("Select recommendation numbers", default="", show_default=False).strip()
647
+ selected: list[str] = []
648
+ for token in re.split(r"[\s,]+", raw_numbers):
649
+ if not token:
650
+ continue
651
+ try:
652
+ index = int(token)
653
+ except ValueError:
654
+ continue
655
+ if 1 <= index <= len(llm_result.recommendations):
656
+ lexicon_id = llm_result.recommendations[index - 1].lexicon_id
657
+ if lexicon_id not in selected:
658
+ selected.append(lexicon_id)
659
+ return selected
660
+
661
+
562
662
  @main.group("lexicon")
563
663
  def lexicon_cmd() -> None:
564
664
  """Manage bundled lexicon plug-ins."""
@@ -292,18 +292,23 @@ def _existing_axes_text(project_root: Path) -> str:
292
292
 
293
293
 
294
294
  def _project_scope_phase(project_root: Path) -> tuple[str, str]:
295
+ # cmd_455: default scope = system_implementation matches CoDD's design
296
+ # focus. Projects that want every dimension (including business goals,
297
+ # UAT detail, risk register) opt in via `scope: full` in project_lexicon.yaml.
298
+ from codd.lexicon import DEFAULT_PHASE, DEFAULT_SCOPE
299
+
295
300
  for name in ("project_lexicon.yaml", "project_lexicon.yml"):
296
301
  path = project_root / name
297
302
  if not path.is_file():
298
303
  continue
299
304
  payload = yaml.safe_load(path.read_text(encoding="utf-8")) or {}
300
305
  if not isinstance(payload, Mapping):
301
- return "full", "production"
306
+ return DEFAULT_SCOPE, DEFAULT_PHASE
302
307
  return (
303
- str(payload.get("scope") or "full"),
304
- str(payload.get("phase") or "production"),
308
+ str(payload.get("scope") or DEFAULT_SCOPE),
309
+ str(payload.get("phase") or DEFAULT_PHASE),
305
310
  )
306
- return "full", "production"
311
+ return DEFAULT_SCOPE, DEFAULT_PHASE
307
312
 
308
313
 
309
314
  def _apply_scope_phase(
@@ -0,0 +1,234 @@
1
+ """LLM-backed lexicon recommendation from project context."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from dataclasses import dataclass
6
+ import json
7
+ from pathlib import Path
8
+ from typing import Any, Literal, Protocol
9
+
10
+ import yaml
11
+
12
+ from codd.deployment.providers.ai_command import AiCommandError, SubprocessAiCommand
13
+ from codd.init.lexicon_suggest import default_lexicon_root
14
+ from codd.init.stack_detector import StackDetector
15
+
16
+
17
+ Confidence = Literal["high", "medium", "low"]
18
+ _CONFIDENCES: set[str] = {"high", "medium", "low"}
19
+ _MAX_DOC_CHARS = 24_000
20
+ _MAX_FILE_CHARS = 4_000
21
+
22
+
23
+ class AiCommand(Protocol):
24
+ def invoke(self, prompt: str, model: str | None = None) -> str:
25
+ """Return an AI response for the supplied prompt."""
26
+
27
+
28
+ @dataclass(frozen=True)
29
+ class LlmLexiconRecommendation:
30
+ lexicon_id: str
31
+ confidence: Confidence
32
+ reason: str
33
+
34
+
35
+ @dataclass(frozen=True)
36
+ class LlmLexiconResult:
37
+ detected_domain: str
38
+ detected_compliance: list[str]
39
+ detected_tech_stack: list[str]
40
+ detected_integrations: list[str]
41
+ recommendations: list[LlmLexiconRecommendation]
42
+
43
+
44
+ def llm_recommend_lexicons(
45
+ project_root: Path,
46
+ *,
47
+ ai_command: AiCommand | None = None,
48
+ ) -> LlmLexiconResult:
49
+ """Recommend lexicons via AI, returning an empty result on unusable input."""
50
+
51
+ root = Path(project_root)
52
+ context = _collect_project_context(root)
53
+ if not context["requirements"]:
54
+ return _empty_result()
55
+
56
+ available = _available_lexicons()
57
+ if not available:
58
+ return _empty_result()
59
+
60
+ command = ai_command or SubprocessAiCommand(project_root=root)
61
+ prompt = _build_prompt(context, available)
62
+ try:
63
+ raw_output = command.invoke(prompt)
64
+ payload = json.loads(_extract_json_object(raw_output))
65
+ except (AiCommandError, OSError, TypeError, ValueError, json.JSONDecodeError):
66
+ return _empty_result()
67
+ return _result_from_payload(payload, set(available))
68
+
69
+
70
+ def _collect_project_context(project_root: Path) -> dict[str, Any]:
71
+ requirements = _read_matching_files(
72
+ project_root,
73
+ [
74
+ "requirements.md",
75
+ ".codd/requirements.md",
76
+ "codd/requirements.md",
77
+ "docs/requirements.md",
78
+ "docs/requirements*.md",
79
+ "docs/requirements/**/*.md",
80
+ ],
81
+ )
82
+ designs = _read_matching_files(
83
+ project_root,
84
+ [
85
+ "design/*.md",
86
+ ".codd/design/*.md",
87
+ "codd/design/*.md",
88
+ "docs/design/*.md",
89
+ ],
90
+ )
91
+ detection = StackDetector().detect(project_root)
92
+ return {
93
+ "requirements": requirements,
94
+ "designs": designs,
95
+ "tech_stack_hints": detection.stack_hints,
96
+ "detected_signals": detection.detected_signals,
97
+ }
98
+
99
+
100
+ def _read_matching_files(project_root: Path, patterns: list[str]) -> list[dict[str, str]]:
101
+ seen: set[Path] = set()
102
+ files: list[dict[str, str]] = []
103
+ budget = _MAX_DOC_CHARS
104
+ for pattern in patterns:
105
+ for path in sorted(project_root.glob(pattern)):
106
+ if path in seen or not path.is_file():
107
+ continue
108
+ seen.add(path)
109
+ if budget <= 0:
110
+ return files
111
+ text = path.read_text(encoding="utf-8", errors="replace")[: min(_MAX_FILE_CHARS, budget)]
112
+ budget -= len(text)
113
+ files.append({"path": path.relative_to(project_root).as_posix(), "content": text})
114
+ return files
115
+
116
+
117
+ def _available_lexicons() -> dict[str, str]:
118
+ root = default_lexicon_root()
119
+ available: dict[str, str] = {}
120
+ if not root.is_dir():
121
+ return available
122
+ for manifest in sorted(root.glob("*/manifest.yaml")):
123
+ try:
124
+ payload = yaml.safe_load(manifest.read_text(encoding="utf-8")) or {}
125
+ except (OSError, yaml.YAMLError):
126
+ continue
127
+ if not isinstance(payload, dict):
128
+ continue
129
+ lexicon_id = manifest.parent.name
130
+ if not lexicon_id:
131
+ continue
132
+ available[lexicon_id] = str(payload.get("description") or "").strip()
133
+ return available
134
+
135
+
136
+ def _build_prompt(context: dict[str, Any], available_lexicons: dict[str, str]) -> str:
137
+ payload = {
138
+ "available_lexicons": available_lexicons,
139
+ "project_context": context,
140
+ "required_output_schema": {
141
+ "detected_domain": "string",
142
+ "detected_compliance": ["string"],
143
+ "detected_tech_stack": ["string"],
144
+ "detected_integrations": ["string"],
145
+ "recommendations": [
146
+ {
147
+ "lexicon_id": "string from available_lexicons keys",
148
+ "confidence": "high | medium | low",
149
+ "reason": "short explanation",
150
+ }
151
+ ],
152
+ },
153
+ }
154
+ return (
155
+ "You are a requirements engineer. Analyze the project's documentation and "
156
+ "technology signals. Identify the business domain, compliance obligations, "
157
+ "technology stack, and external integrations using only the supplied project "
158
+ "context. From the available lexicons, recommend the most relevant entries. "
159
+ "Return JSON only. Do not include Markdown fences or prose.\n\n"
160
+ f"{json.dumps(payload, ensure_ascii=False, indent=2)}"
161
+ )
162
+
163
+
164
+ def _extract_json_object(raw_output: str) -> str:
165
+ text = raw_output.strip()
166
+ if text.startswith("```"):
167
+ lines = text.splitlines()
168
+ if lines and lines[0].startswith("```"):
169
+ lines = lines[1:]
170
+ if lines and lines[-1].strip() == "```":
171
+ lines = lines[:-1]
172
+ text = "\n".join(lines).strip()
173
+ start = text.find("{")
174
+ end = text.rfind("}")
175
+ if start == -1 or end == -1 or end < start:
176
+ raise ValueError("LLM output did not contain a JSON object")
177
+ return text[start : end + 1]
178
+
179
+
180
+ def _result_from_payload(payload: Any, available_ids: set[str]) -> LlmLexiconResult:
181
+ if not isinstance(payload, dict):
182
+ return _empty_result()
183
+
184
+ recommendations: list[LlmLexiconRecommendation] = []
185
+ seen: set[str] = set()
186
+ rows = payload.get("recommendations", [])
187
+ if isinstance(rows, list):
188
+ for row in rows:
189
+ if not isinstance(row, dict):
190
+ continue
191
+ lexicon_id = str(row.get("lexicon_id") or "").strip()
192
+ confidence = str(row.get("confidence") or "").strip().lower()
193
+ if lexicon_id not in available_ids or confidence not in _CONFIDENCES or lexicon_id in seen:
194
+ continue
195
+ seen.add(lexicon_id)
196
+ recommendations.append(
197
+ LlmLexiconRecommendation(
198
+ lexicon_id=lexicon_id,
199
+ confidence=confidence, # type: ignore[arg-type]
200
+ reason=str(row.get("reason") or "").strip(),
201
+ )
202
+ )
203
+
204
+ return LlmLexiconResult(
205
+ detected_domain=str(payload.get("detected_domain") or "").strip(),
206
+ detected_compliance=_string_list(payload.get("detected_compliance")),
207
+ detected_tech_stack=_string_list(payload.get("detected_tech_stack")),
208
+ detected_integrations=_string_list(payload.get("detected_integrations")),
209
+ recommendations=recommendations,
210
+ )
211
+
212
+
213
+ def _string_list(value: Any) -> list[str]:
214
+ if not isinstance(value, list):
215
+ return []
216
+ return [str(item).strip() for item in value if str(item).strip()]
217
+
218
+
219
+ def _empty_result() -> LlmLexiconResult:
220
+ return LlmLexiconResult(
221
+ detected_domain="",
222
+ detected_compliance=[],
223
+ detected_tech_stack=[],
224
+ detected_integrations=[],
225
+ recommendations=[],
226
+ )
227
+
228
+
229
+ __all__ = [
230
+ "AiCommand",
231
+ "LlmLexiconRecommendation",
232
+ "LlmLexiconResult",
233
+ "llm_recommend_lexicons",
234
+ ]
@@ -14,7 +14,11 @@ import yaml
14
14
  SCHEMA_PATH = Path(__file__).parent / "templates" / "lexicon_schema.yaml"
15
15
  LEXICON_FILENAME = "project_lexicon.yaml"
16
16
  REQUIRED_ARTIFACT_SOURCES = {"ai_derived", "user_override", "default_template"}
17
- DEFAULT_SCOPE = "full"
17
+ # cmd_455: CoDD's responsibility is system-implementation coherence. Business
18
+ # concerns (goal/KPI, acceptance/UAT detail, risk register) belong upstream of
19
+ # the DAG and should not surface as findings unless the project opts in
20
+ # explicitly with `scope: full` or `scope: business_only`.
21
+ DEFAULT_SCOPE = "system_implementation"
18
22
  DEFAULT_PHASE = "production"
19
23
  LEGACY_SUGGESTED_LEXICONS_WARNING = (
20
24
  "suggested_lexicons is deprecated, renamed to extends; auto-merged"
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "codd-dev"
7
- version = "2.6.1"
7
+ version = "2.8.0"
8
8
  description = "CoDD: Coherence-Driven Development — cross-artifact change impact analysis"
9
9
  readme = "README.md"
10
10
  license = "MIT"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes