codd-dev 2.14.0__tar.gz → 2.16.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 (478) hide show
  1. {codd_dev-2.14.0 → codd_dev-2.16.0}/PKG-INFO +8 -6
  2. {codd_dev-2.14.0 → codd_dev-2.16.0}/README.md +7 -5
  3. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/cli.py +139 -13
  4. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/dag/builder.py +147 -35
  5. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/dag/checks/transitive_closure.py +22 -3
  6. codd_dev-2.16.0/codd/fix/__init__.py +22 -0
  7. codd_dev-2.16.0/codd/fix/candidate_selector.py +306 -0
  8. codd_dev-2.16.0/codd/fix/design_updater.py +180 -0
  9. codd_dev-2.16.0/codd/fix/interactive_prompt.py +209 -0
  10. codd_dev-2.16.0/codd/fix/phenomenon_fixer.py +550 -0
  11. codd_dev-2.16.0/codd/fix/phenomenon_parser.py +156 -0
  12. codd_dev-2.16.0/codd/fix/risk_classifier.py +190 -0
  13. codd_dev-2.16.0/codd/fix/templates_loader.py +40 -0
  14. {codd_dev-2.14.0 → codd_dev-2.16.0}/pyproject.toml +1 -1
  15. {codd_dev-2.14.0 → codd_dev-2.16.0}/.gitignore +0 -0
  16. {codd_dev-2.14.0 → codd_dev-2.16.0}/LICENSE +0 -0
  17. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/__init__.py +0 -0
  18. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/__main__.py +0 -0
  19. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/_git_helper.py +0 -0
  20. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/ask_user_question_adapter.py +0 -0
  21. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/assembler.py +0 -0
  22. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/bridge.py +0 -0
  23. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/brownfield/__init__.py +0 -0
  24. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/brownfield/pipeline.py +0 -0
  25. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/clustering.py +0 -0
  26. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/coherence_adapters.py +0 -0
  27. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/coherence_engine.py +0 -0
  28. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/config.py +0 -0
  29. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/contracts.py +0 -0
  30. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/coverage_auditor.py +0 -0
  31. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/coverage_metrics.py +0 -0
  32. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/dag/__init__.py +0 -0
  33. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/dag/auto_repair.py +0 -0
  34. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/dag/checks/__init__.py +0 -0
  35. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/dag/checks/ci_health.py +0 -0
  36. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/dag/checks/depends_on_consistency.py +0 -0
  37. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/dag/checks/deployment_completeness.py +0 -0
  38. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/dag/checks/edge_validity.py +0 -0
  39. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/dag/checks/environment_coverage.py +0 -0
  40. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/dag/checks/implementation_coverage.py +0 -0
  41. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/dag/checks/node_completeness.py +0 -0
  42. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/dag/checks/opt_out.py +0 -0
  43. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/dag/checks/task_completion.py +0 -0
  44. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/dag/checks/user_journey_coherence.py +0 -0
  45. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/dag/coverage_axes.py +0 -0
  46. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/dag/defaults/cli.yaml +0 -0
  47. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/dag/defaults/cpp_embedded.yaml +0 -0
  48. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/dag/defaults/csharp.yaml +0 -0
  49. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/dag/defaults/elixir.yaml +0 -0
  50. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/dag/defaults/generic.yaml +0 -0
  51. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/dag/defaults/iot.yaml +0 -0
  52. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/dag/defaults/java.yaml +0 -0
  53. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/dag/defaults/kotlin.yaml +0 -0
  54. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/dag/defaults/mobile.yaml +0 -0
  55. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/dag/defaults/ruby.yaml +0 -0
  56. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/dag/defaults/rust.yaml +0 -0
  57. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/dag/defaults/scala.yaml +0 -0
  58. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/dag/defaults/swift.yaml +0 -0
  59. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/dag/defaults/test_frameworks.yaml +0 -0
  60. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/dag/defaults/web.yaml +0 -0
  61. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/dag/extractor.py +0 -0
  62. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/dag/runner.py +0 -0
  63. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/defaults.py +0 -0
  64. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/defaults.yaml +0 -0
  65. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/deploy_targets/__init__.py +0 -0
  66. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/deploy_targets/app_service.py +0 -0
  67. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/deploy_targets/base.py +0 -0
  68. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/deploy_targets/docker_compose.py +0 -0
  69. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/deployer.py +0 -0
  70. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/deployment/__init__.py +0 -0
  71. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/deployment/checks/__init__.py +0 -0
  72. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/deployment/defaults/deploy_targets.yaml +0 -0
  73. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/deployment/defaults/runtime_capability_inference.yaml +0 -0
  74. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/deployment/defaults/schema_providers.yaml +0 -0
  75. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/deployment/defaults/verification_templates.yaml +0 -0
  76. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/deployment/extractor.py +0 -0
  77. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/deployment/providers/__init__.py +0 -0
  78. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/deployment/providers/ai_command.py +0 -0
  79. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/deployment/providers/llm_consideration.py +0 -0
  80. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/deployment/providers/schema/__init__.py +0 -0
  81. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/deployment/providers/schema/prisma.py +0 -0
  82. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/deployment/providers/target/__init__.py +0 -0
  83. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/deployment/providers/target/docker_compose.py +0 -0
  84. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/deployment/providers/verification/__init__.py +0 -0
  85. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/deployment/providers/verification/assertion_handlers.py +0 -0
  86. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/deployment/providers/verification/cdp_browser.py +0 -0
  87. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/deployment/providers/verification/cdp_engines.py +0 -0
  88. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/deployment/providers/verification/cdp_launchers.py +0 -0
  89. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/deployment/providers/verification/cdp_wire.py +0 -0
  90. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/deployment/providers/verification/curl.py +0 -0
  91. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/deployment/providers/verification/form_strategies.py +0 -0
  92. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/deployment/providers/verification/means_catalog.py +0 -0
  93. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/deployment/providers/verification/playwright.py +0 -0
  94. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/design_md.py +0 -0
  95. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/diff/__init__.py +0 -0
  96. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/diff/apply.py +0 -0
  97. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/diff/engine.py +0 -0
  98. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/diff/persistence.py +0 -0
  99. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/diff/templates/diff_prompt.md +0 -0
  100. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/drift.py +0 -0
  101. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/e2e_extractor.py +0 -0
  102. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/e2e_generator.py +0 -0
  103. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/e2e_runner.py +0 -0
  104. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/elicit/__init__.py +0 -0
  105. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/elicit/apply.py +0 -0
  106. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/elicit/engine.py +0 -0
  107. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/elicit/finding.py +0 -0
  108. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/elicit/formatters/__init__.py +0 -0
  109. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/elicit/formatters/base.py +0 -0
  110. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/elicit/formatters/interactive.py +0 -0
  111. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/elicit/formatters/json_fmt.py +0 -0
  112. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/elicit/formatters/md.py +0 -0
  113. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/elicit/lexicon_loader.py +0 -0
  114. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/elicit/persistence.py +0 -0
  115. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/elicit/templates/elicit_prompt_L0.md +0 -0
  116. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/env_refs.py +0 -0
  117. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/extract_ai.py +0 -0
  118. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/extractor.py +0 -0
  119. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/fixer.py +0 -0
  120. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/fixup_drift.py +0 -0
  121. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/fixup_drift_strategies/__init__.py +0 -0
  122. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/fixup_drift_strategies/design_token_drift.py +0 -0
  123. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/fixup_drift_strategies/lexicon_violation.py +0 -0
  124. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/fixup_drift_strategies/url_drift.py +0 -0
  125. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/generator.py +0 -0
  126. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/graph.py +0 -0
  127. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/hitl_session.py +0 -0
  128. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/hooks/__init__.py +0 -0
  129. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/hooks/pre-commit +0 -0
  130. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/hooks/recipes/claude_settings_example.json +0 -0
  131. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/hooks/recipes/codex_hook.sh +0 -0
  132. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/hooks/recipes/git_post_commit.sh +0 -0
  133. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/hooks/recipes/git_pre_commit.sh +0 -0
  134. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/implementer/__init__.py +0 -0
  135. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/implementer/chunked_runner.py +0 -0
  136. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/implementer/typecheck_loop.py +0 -0
  137. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/implementer.py +0 -0
  138. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/inheritance.py +0 -0
  139. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/init/__init__.py +0 -0
  140. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/init/lexicon_suggest.py +0 -0
  141. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/init/llm_lexicon_suggester.py +0 -0
  142. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/init/stack_detector.py +0 -0
  143. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/knowledge_fetcher.py +0 -0
  144. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/lexicon.py +0 -0
  145. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/lexicon_cli/__init__.py +0 -0
  146. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/lexicon_cli/formatters/__init__.py +0 -0
  147. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/lexicon_cli/formatters/html.py +0 -0
  148. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/lexicon_cli/formatters/json_fmt.py +0 -0
  149. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/lexicon_cli/formatters/md.py +0 -0
  150. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/lexicon_cli/inspector.py +0 -0
  151. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/lexicon_cli/manager.py +0 -0
  152. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/lexicon_cli/reporter.py +0 -0
  153. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/lexicon_cli/threshold.py +0 -0
  154. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/llm/__init__.py +0 -0
  155. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/llm/approval.py +0 -0
  156. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/llm/best_practice_augmenter.py +0 -0
  157. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/llm/criteria_expander.py +0 -0
  158. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/llm/design_doc_extractor.py +0 -0
  159. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/llm/impl_step_deriver.py +0 -0
  160. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/llm/means_catalog_loader.py +0 -0
  161. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/llm/parser.py +0 -0
  162. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/llm/plan_deriver.py +0 -0
  163. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/llm/prompt_builder.py +0 -0
  164. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/llm/strategy_validator.py +0 -0
  165. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/llm/templates/best_practice_augment_meta.md +0 -0
  166. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/llm/templates/criteria_expand_meta.md +0 -0
  167. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/llm/templates/design_doc_extract_meta.md +0 -0
  168. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/llm/templates/impl_step_derive_meta.md +0 -0
  169. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/llm/templates/implementation_step_catalog.yaml +0 -0
  170. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/llm/templates/meta_instruction.md +0 -0
  171. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/llm/templates/plan_derive_meta.md +0 -0
  172. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/llm/templates/verification_means_catalog.yaml +0 -0
  173. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/mcp_server.py +0 -0
  174. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/measure.py +0 -0
  175. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/parsing.py +0 -0
  176. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/planner.py +0 -0
  177. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/policy.py +0 -0
  178. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/preflight/__init__.py +0 -0
  179. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/preflight/defaults/cli.yaml +0 -0
  180. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/preflight/defaults/iot.yaml +0 -0
  181. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/preflight/defaults/mobile.yaml +0 -0
  182. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/preflight/defaults/web.yaml +0 -0
  183. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/propagate.py +0 -0
  184. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/propagator.py +0 -0
  185. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/registry.py +0 -0
  186. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/repair/__init__.py +0 -0
  187. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/repair/approval_repair.py +0 -0
  188. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/repair/engine.py +0 -0
  189. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/repair/git_patcher.py +0 -0
  190. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/repair/history.py +0 -0
  191. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/repair/llm_repair_engine.py +0 -0
  192. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/repair/loop.py +0 -0
  193. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/repair/primary_picker.py +0 -0
  194. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/repair/proof_breaks.py +0 -0
  195. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/repair/repair_result.py +0 -0
  196. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/repair/repairability_classifier.py +0 -0
  197. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/repair/schema.py +0 -0
  198. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/repair/templates/analyze_meta.md +0 -0
  199. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/repair/templates/propose_meta.md +0 -0
  200. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/repair/templates/repair_strategy_meta.md +0 -0
  201. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/repair/templates/repairability_meta.md +0 -0
  202. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/repair/verify_runner.py +0 -0
  203. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/repair_slice.py +0 -0
  204. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/require.py +0 -0
  205. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/require_plugins.py +0 -0
  206. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/require_propagate.py +0 -0
  207. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/required_artifacts/defaults/cli.yaml +0 -0
  208. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/required_artifacts/defaults/iot.yaml +0 -0
  209. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/required_artifacts/defaults/mobile.yaml +0 -0
  210. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/required_artifacts/defaults/web.yaml +0 -0
  211. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/required_artifacts_deriver.py +0 -0
  212. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/requirement_completeness/defaults/cli.yaml +0 -0
  213. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/requirement_completeness/defaults/iot.yaml +0 -0
  214. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/requirement_completeness/defaults/mobile.yaml +0 -0
  215. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/requirement_completeness/defaults/web.yaml +0 -0
  216. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/requirement_completeness_auditor.py +0 -0
  217. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/restore.py +0 -0
  218. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/routes_extractor.py +0 -0
  219. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/scanner.py +0 -0
  220. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/schema_refs.py +0 -0
  221. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/screen_flow_validator.py +0 -0
  222. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/screen_transition_extractor.py +0 -0
  223. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/screen_transitions/defaults.yaml +0 -0
  224. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/synth.py +0 -0
  225. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/templates/codd.yaml.tmpl +0 -0
  226. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/templates/conventions.yaml.tmpl +0 -0
  227. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/templates/data_dependencies.yaml.tmpl +0 -0
  228. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/templates/doc_links.yaml.tmpl +0 -0
  229. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/templates/extract_ai_prompt_baseline.md +0 -0
  230. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/templates/extracted/api-contract.md.j2 +0 -0
  231. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/templates/extracted/architecture-overview.md.j2 +0 -0
  232. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/templates/extracted/module-detail.md.j2 +0 -0
  233. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/templates/extracted/schema-design.md.j2 +0 -0
  234. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/templates/extracted/system-context.md.j2 +0 -0
  235. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/templates/gitignore.tmpl +0 -0
  236. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/templates/lexicon_questions.md +0 -0
  237. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/templates/lexicon_schema.yaml +0 -0
  238. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/templates/overrides.yaml.tmpl +0 -0
  239. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/traceability.py +0 -0
  240. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/validator.py +0 -0
  241. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/watch/__init__.py +0 -0
  242. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/watch/events.py +0 -0
  243. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/watch/propagation_log.py +0 -0
  244. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/watch/propagation_pipeline.py +0 -0
  245. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/watch/test_runner.py +0 -0
  246. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/watch/watcher.py +0 -0
  247. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/wiring.py +0 -0
  248. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ai_governance_eu_act/coverage_matrix.md +0 -0
  249. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ai_governance_eu_act/elicit_extend.md +0 -0
  250. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ai_governance_eu_act/lexicon.yaml +0 -0
  251. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ai_governance_eu_act/manifest.yaml +0 -0
  252. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ai_governance_eu_act/recommended_kinds.yaml +0 -0
  253. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ai_governance_eu_act/severity_rules.yaml +0 -0
  254. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/api_rate_limiting_caching/coverage_matrix.md +0 -0
  255. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/api_rate_limiting_caching/elicit_extend.md +0 -0
  256. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/api_rate_limiting_caching/lexicon.yaml +0 -0
  257. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/api_rate_limiting_caching/manifest.yaml +0 -0
  258. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/api_rate_limiting_caching/recommended_kinds.yaml +0 -0
  259. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/api_rate_limiting_caching/severity_rules.yaml +0 -0
  260. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/api_rest_openapi/coverage_matrix.md +0 -0
  261. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/api_rest_openapi/elicit_extend.md +0 -0
  262. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/api_rest_openapi/lexicon.yaml +0 -0
  263. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/api_rest_openapi/manifest.yaml +0 -0
  264. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/api_rest_openapi/recommended_kinds.yaml +0 -0
  265. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/api_rest_openapi/severity_rules.yaml +0 -0
  266. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/babok/elicit_extend.md +0 -0
  267. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/babok/lexicon.yaml +0 -0
  268. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/babok/manifest.yaml +0 -0
  269. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/babok/recommended_kinds.yaml +0 -0
  270. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/babok/severity_rules.yaml +0 -0
  271. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/backend_event_cloudevents/coverage_matrix.md +0 -0
  272. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/backend_event_cloudevents/elicit_extend.md +0 -0
  273. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/backend_event_cloudevents/lexicon.yaml +0 -0
  274. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/backend_event_cloudevents/manifest.yaml +0 -0
  275. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/backend_event_cloudevents/recommended_kinds.yaml +0 -0
  276. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/backend_event_cloudevents/severity_rules.yaml +0 -0
  277. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/backend_graphql/coverage_matrix.md +0 -0
  278. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/backend_graphql/elicit_extend.md +0 -0
  279. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/backend_graphql/lexicon.yaml +0 -0
  280. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/backend_graphql/manifest.yaml +0 -0
  281. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/backend_graphql/recommended_kinds.yaml +0 -0
  282. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/backend_graphql/severity_rules.yaml +0 -0
  283. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/backend_grpc_proto/coverage_matrix.md +0 -0
  284. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/backend_grpc_proto/elicit_extend.md +0 -0
  285. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/backend_grpc_proto/lexicon.yaml +0 -0
  286. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/backend_grpc_proto/manifest.yaml +0 -0
  287. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/backend_grpc_proto/recommended_kinds.yaml +0 -0
  288. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/backend_grpc_proto/severity_rules.yaml +0 -0
  289. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/compliance_hipaa/coverage_matrix.md +0 -0
  290. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/compliance_hipaa/elicit_extend.md +0 -0
  291. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/compliance_hipaa/lexicon.yaml +0 -0
  292. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/compliance_hipaa/manifest.yaml +0 -0
  293. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/compliance_hipaa/recommended_kinds.yaml +0 -0
  294. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/compliance_hipaa/severity_rules.yaml +0 -0
  295. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/compliance_iso27001/coverage_matrix.md +0 -0
  296. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/compliance_iso27001/elicit_extend.md +0 -0
  297. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/compliance_iso27001/lexicon.yaml +0 -0
  298. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/compliance_iso27001/manifest.yaml +0 -0
  299. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/compliance_iso27001/recommended_kinds.yaml +0 -0
  300. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/compliance_iso27001/severity_rules.yaml +0 -0
  301. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/compliance_pci_dss_4/coverage_matrix.md +0 -0
  302. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/compliance_pci_dss_4/elicit_extend.md +0 -0
  303. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/compliance_pci_dss_4/lexicon.yaml +0 -0
  304. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/compliance_pci_dss_4/manifest.yaml +0 -0
  305. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/compliance_pci_dss_4/recommended_kinds.yaml +0 -0
  306. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/compliance_pci_dss_4/severity_rules.yaml +0 -0
  307. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/coverage_matrix.md +0 -0
  308. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/elicit_extend.md +0 -0
  309. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/lexicon.yaml +0 -0
  310. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/manifest.yaml +0 -0
  311. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/recommended_kinds.yaml +0 -0
  312. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/severity_rules.yaml +0 -0
  313. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/data_governance_appi_gdpr/coverage_matrix.md +0 -0
  314. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/data_governance_appi_gdpr/elicit_extend.md +0 -0
  315. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/data_governance_appi_gdpr/lexicon.yaml +0 -0
  316. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/data_governance_appi_gdpr/manifest.yaml +0 -0
  317. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/data_governance_appi_gdpr/recommended_kinds.yaml +0 -0
  318. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/data_governance_appi_gdpr/severity_rules.yaml +0 -0
  319. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/data_nosql_jsonschema/coverage_matrix.md +0 -0
  320. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/data_nosql_jsonschema/elicit_extend.md +0 -0
  321. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/data_nosql_jsonschema/lexicon.yaml +0 -0
  322. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/data_nosql_jsonschema/manifest.yaml +0 -0
  323. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/data_nosql_jsonschema/recommended_kinds.yaml +0 -0
  324. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/data_nosql_jsonschema/severity_rules.yaml +0 -0
  325. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/data_relational_iso_sql/coverage_matrix.md +0 -0
  326. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/data_relational_iso_sql/elicit_extend.md +0 -0
  327. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/data_relational_iso_sql/lexicon.yaml +0 -0
  328. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/data_relational_iso_sql/manifest.yaml +0 -0
  329. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/data_relational_iso_sql/recommended_kinds.yaml +0 -0
  330. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/data_relational_iso_sql/severity_rules.yaml +0 -0
  331. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ddd_domain_driven_design/coverage_matrix.md +0 -0
  332. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ddd_domain_driven_design/elicit_extend.md +0 -0
  333. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ddd_domain_driven_design/lexicon.yaml +0 -0
  334. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ddd_domain_driven_design/manifest.yaml +0 -0
  335. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ddd_domain_driven_design/recommended_kinds.yaml +0 -0
  336. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ddd_domain_driven_design/severity_rules.yaml +0 -0
  337. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/dora_sre_metrics/coverage_matrix.md +0 -0
  338. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/dora_sre_metrics/elicit_extend.md +0 -0
  339. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/dora_sre_metrics/lexicon.yaml +0 -0
  340. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/dora_sre_metrics/manifest.yaml +0 -0
  341. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/dora_sre_metrics/recommended_kinds.yaml +0 -0
  342. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/dora_sre_metrics/severity_rules.yaml +0 -0
  343. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/i18n_unicode_cldr/coverage_matrix.md +0 -0
  344. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/i18n_unicode_cldr/elicit_extend.md +0 -0
  345. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/i18n_unicode_cldr/lexicon.yaml +0 -0
  346. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/i18n_unicode_cldr/manifest.yaml +0 -0
  347. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/i18n_unicode_cldr/recommended_kinds.yaml +0 -0
  348. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/i18n_unicode_cldr/severity_rules.yaml +0 -0
  349. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ml_model_cards/coverage_matrix.md +0 -0
  350. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ml_model_cards/elicit_extend.md +0 -0
  351. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ml_model_cards/lexicon.yaml +0 -0
  352. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ml_model_cards/manifest.yaml +0 -0
  353. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ml_model_cards/recommended_kinds.yaml +0 -0
  354. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ml_model_cards/severity_rules.yaml +0 -0
  355. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/mobile_a11y_native/coverage_matrix.md +0 -0
  356. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/mobile_a11y_native/elicit_extend.md +0 -0
  357. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/mobile_a11y_native/lexicon.yaml +0 -0
  358. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/mobile_a11y_native/manifest.yaml +0 -0
  359. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/mobile_a11y_native/recommended_kinds.yaml +0 -0
  360. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/mobile_a11y_native/severity_rules.yaml +0 -0
  361. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/mobile_android_material3/coverage_matrix.md +0 -0
  362. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/mobile_android_material3/elicit_extend.md +0 -0
  363. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/mobile_android_material3/lexicon.yaml +0 -0
  364. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/mobile_android_material3/manifest.yaml +0 -0
  365. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/mobile_android_material3/recommended_kinds.yaml +0 -0
  366. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/mobile_android_material3/severity_rules.yaml +0 -0
  367. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/mobile_ios_hig/coverage_matrix.md +0 -0
  368. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/mobile_ios_hig/elicit_extend.md +0 -0
  369. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/mobile_ios_hig/lexicon.yaml +0 -0
  370. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/mobile_ios_hig/manifest.yaml +0 -0
  371. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/mobile_ios_hig/recommended_kinds.yaml +0 -0
  372. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/mobile_ios_hig/severity_rules.yaml +0 -0
  373. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/mobile_security_masvs/coverage_matrix.md +0 -0
  374. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/mobile_security_masvs/elicit_extend.md +0 -0
  375. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/mobile_security_masvs/lexicon.yaml +0 -0
  376. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/mobile_security_masvs/manifest.yaml +0 -0
  377. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/mobile_security_masvs/recommended_kinds.yaml +0 -0
  378. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/mobile_security_masvs/severity_rules.yaml +0 -0
  379. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ops_cicd_pipeline/coverage_matrix.md +0 -0
  380. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ops_cicd_pipeline/elicit_extend.md +0 -0
  381. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ops_cicd_pipeline/lexicon.yaml +0 -0
  382. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ops_cicd_pipeline/manifest.yaml +0 -0
  383. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ops_cicd_pipeline/recommended_kinds.yaml +0 -0
  384. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ops_cicd_pipeline/severity_rules.yaml +0 -0
  385. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ops_iac_terraform/coverage_matrix.md +0 -0
  386. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ops_iac_terraform/elicit_extend.md +0 -0
  387. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ops_iac_terraform/lexicon.yaml +0 -0
  388. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ops_iac_terraform/manifest.yaml +0 -0
  389. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ops_iac_terraform/recommended_kinds.yaml +0 -0
  390. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ops_iac_terraform/severity_rules.yaml +0 -0
  391. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ops_kubernetes/coverage_matrix.md +0 -0
  392. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ops_kubernetes/elicit_extend.md +0 -0
  393. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ops_kubernetes/lexicon.yaml +0 -0
  394. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ops_kubernetes/manifest.yaml +0 -0
  395. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ops_kubernetes/recommended_kinds.yaml +0 -0
  396. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ops_kubernetes/severity_rules.yaml +0 -0
  397. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ops_observability_otel/coverage_matrix.md +0 -0
  398. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ops_observability_otel/elicit_extend.md +0 -0
  399. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ops_observability_otel/lexicon.yaml +0 -0
  400. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ops_observability_otel/manifest.yaml +0 -0
  401. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ops_observability_otel/recommended_kinds.yaml +0 -0
  402. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ops_observability_otel/severity_rules.yaml +0 -0
  403. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/process_iso25010/coverage_matrix.md +0 -0
  404. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/process_iso25010/elicit_extend.md +0 -0
  405. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/process_iso25010/lexicon.yaml +0 -0
  406. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/process_iso25010/manifest.yaml +0 -0
  407. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/process_iso25010/recommended_kinds.yaml +0 -0
  408. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/process_iso25010/severity_rules.yaml +0 -0
  409. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/process_test_iso29119/coverage_matrix.md +0 -0
  410. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/process_test_iso29119/elicit_extend.md +0 -0
  411. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/process_test_iso29119/lexicon.yaml +0 -0
  412. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/process_test_iso29119/manifest.yaml +0 -0
  413. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/process_test_iso29119/recommended_kinds.yaml +0 -0
  414. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/process_test_iso29119/severity_rules.yaml +0 -0
  415. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/twelve_factor_app/coverage_matrix.md +0 -0
  416. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/twelve_factor_app/elicit_extend.md +0 -0
  417. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/twelve_factor_app/lexicon.yaml +0 -0
  418. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/twelve_factor_app/manifest.yaml +0 -0
  419. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/twelve_factor_app/recommended_kinds.yaml +0 -0
  420. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/twelve_factor_app/severity_rules.yaml +0 -0
  421. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/coverage_matrix.md +0 -0
  422. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/elicit_extend.md +0 -0
  423. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/lexicon.yaml +0 -0
  424. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/manifest.yaml +0 -0
  425. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/recommended_kinds.yaml +0 -0
  426. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/severity_rules.yaml +0 -0
  427. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_authn_webauthn/coverage_matrix.md +0 -0
  428. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_authn_webauthn/elicit_extend.md +0 -0
  429. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_authn_webauthn/lexicon.yaml +0 -0
  430. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_authn_webauthn/manifest.yaml +0 -0
  431. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_authn_webauthn/recommended_kinds.yaml +0 -0
  432. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_authn_webauthn/severity_rules.yaml +0 -0
  433. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_browser_compat/coverage_matrix.md +0 -0
  434. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_browser_compat/elicit_extend.md +0 -0
  435. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_browser_compat/lexicon.yaml +0 -0
  436. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_browser_compat/manifest.yaml +0 -0
  437. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_browser_compat/recommended_kinds.yaml +0 -0
  438. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_browser_compat/severity_rules.yaml +0 -0
  439. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_forms_html5/coverage_matrix.md +0 -0
  440. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_forms_html5/elicit_extend.md +0 -0
  441. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_forms_html5/lexicon.yaml +0 -0
  442. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_forms_html5/manifest.yaml +0 -0
  443. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_forms_html5/recommended_kinds.yaml +0 -0
  444. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_forms_html5/severity_rules.yaml +0 -0
  445. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_performance_core_web_vitals/coverage_matrix.md +0 -0
  446. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_performance_core_web_vitals/elicit_extend.md +0 -0
  447. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_performance_core_web_vitals/lexicon.yaml +0 -0
  448. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_performance_core_web_vitals/manifest.yaml +0 -0
  449. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_performance_core_web_vitals/recommended_kinds.yaml +0 -0
  450. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_performance_core_web_vitals/severity_rules.yaml +0 -0
  451. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_pwa_manifest/coverage_matrix.md +0 -0
  452. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_pwa_manifest/elicit_extend.md +0 -0
  453. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_pwa_manifest/lexicon.yaml +0 -0
  454. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_pwa_manifest/manifest.yaml +0 -0
  455. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_pwa_manifest/recommended_kinds.yaml +0 -0
  456. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_pwa_manifest/severity_rules.yaml +0 -0
  457. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_responsive/coverage_matrix.md +0 -0
  458. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_responsive/elicit_extend.md +0 -0
  459. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_responsive/lexicon.yaml +0 -0
  460. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_responsive/manifest.yaml +0 -0
  461. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_responsive/recommended_kinds.yaml +0 -0
  462. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_responsive/severity_rules.yaml +0 -0
  463. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_security_owasp/coverage_matrix.md +0 -0
  464. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_security_owasp/elicit_extend.md +0 -0
  465. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_security_owasp/lexicon.yaml +0 -0
  466. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_security_owasp/manifest.yaml +0 -0
  467. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_security_owasp/recommended_kinds.yaml +0 -0
  468. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_security_owasp/severity_rules.yaml +0 -0
  469. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_seo_schemaorg/coverage_matrix.md +0 -0
  470. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_seo_schemaorg/elicit_extend.md +0 -0
  471. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_seo_schemaorg/lexicon.yaml +0 -0
  472. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_seo_schemaorg/manifest.yaml +0 -0
  473. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_seo_schemaorg/recommended_kinds.yaml +0 -0
  474. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_seo_schemaorg/severity_rules.yaml +0 -0
  475. {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/stack_map.yaml +0 -0
  476. {codd_dev-2.14.0 → codd_dev-2.16.0}/docs/cookbook/cdp_browser/README.md +0 -0
  477. {codd_dev-2.14.0 → codd_dev-2.16.0}/docs/requirements/README.md +0 -0
  478. {codd_dev-2.14.0 → codd_dev-2.16.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.14.0
3
+ Version: 2.16.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
@@ -153,11 +153,13 @@ This is what lets CoDD ship one core that works for Next.js, Django, FastAPI, Ra
153
153
 
154
154
  ## 🧭 Roadmap
155
155
 
156
- - **v2.14.0 (current)** — 8 structural gaps closed (cmd_466 dogfood). Sidecar `<test>.codd.yaml` with `verified_by:` (C6) and `axis_matrix:` (C9); lexicon schema SSoT; completeness_audit batch; `scan.exclude` bug fix (−52% amber noise); `codd dag verify --auto-repair`; elicit mock-AI sentinel; AI timeout 3600 s SSoT. Dogfood re-run: red 22 0. See [CHANGELOG](CHANGELOG.md).
157
- - **v2.13.0** — Opt-out protection: `OptOutPolicy` requires a `justification` + `expires_at` for every config-level opt-out (`ci.provider=none`, etc.). Silent SKIP abolished; severity preserved. `codd validate` reports policy violations. See [post-mortem](docs/post-mortems/optout_loophole.md).
158
- - **v2.12.0** — Test-completeness gates: C7 `actors_without_journeys` amber promotion + new C8 `ci_health` static check (workflow presence, trigger coverage, verification-in-workflow). See [post-mortem](docs/post-mortems/test_completeness_gap.md).
159
- - **v2.11.0** — Sprint-less `codd implement` (`--design <path> --output <dir>` directly; `implementation_plan.md` parser removed). See [migration guide](docs/migrations/v2.11.0-sprintless.md).
160
- - **v2.15.0 (next)** — C8 `ci_health` runtime mode (opt-in `ci.runtime_check: true`) polling the CI provider for latest-run-on-default-branch success.
156
+ - **v2.16.0 (current)** — `codd fix [PHENOMENON]` North Star entry-point 2 (cmd_468). Express a desired change in natural language; CoDD identifies affected design docs via Tier-1 lexicon + Tier-2 semantic scoring, updates them with LLM, runs the DAG verify gate. Full interactive HITL (candidate selection, ambiguity clarification, risk confirmation) with `--non-interactive` for CI. 66 new tests, 2908 total PASS, SKIP=0. See [CHANGELOG](CHANGELOG.md).
157
+ - **v2.15.0** — `kind: common` for shared infrastructure (cmd_467). C5 amber −79.2% on dogfood LMS (125 26). `**` glob translator fix.
158
+ - **v2.14.0** — 8 structural gaps closed (cmd_466 dogfood). Sidecar `<test>.codd.yaml` with `verified_by:` (C6) / `axis_matrix:` (C9); lexicon schema SSoT; completeness_audit batch; `scan.exclude` bug fix (−52%); `codd dag verify --auto-repair`; elicit mock-AI sentinel; AI timeout 3600 s SSoT. Red 22 → 0.
159
+ - **v2.13.0** — Opt-out protection: `OptOutPolicy` requires `justification` + `expires_at`. Silent SKIP abolished; severity preserved.
160
+ - **v2.12.0** — Test-completeness gates: C7 amber promotion + C8 `ci_health` static check.
161
+ - **v2.11.0** — Sprint-less `codd implement` (`--design <path> --output <dir>` directly).
162
+ - **v2.17.0 (next)** — impl/test auto-propagation from PHENOMENON (AC #8 completion); Codex wrapper for PHENOMENON mode.
161
163
 
162
164
  ---
163
165
 
@@ -113,11 +113,13 @@ This is what lets CoDD ship one core that works for Next.js, Django, FastAPI, Ra
113
113
 
114
114
  ## 🧭 Roadmap
115
115
 
116
- - **v2.14.0 (current)** — 8 structural gaps closed (cmd_466 dogfood). Sidecar `<test>.codd.yaml` with `verified_by:` (C6) and `axis_matrix:` (C9); lexicon schema SSoT; completeness_audit batch; `scan.exclude` bug fix (−52% amber noise); `codd dag verify --auto-repair`; elicit mock-AI sentinel; AI timeout 3600 s SSoT. Dogfood re-run: red 22 0. See [CHANGELOG](CHANGELOG.md).
117
- - **v2.13.0** — Opt-out protection: `OptOutPolicy` requires a `justification` + `expires_at` for every config-level opt-out (`ci.provider=none`, etc.). Silent SKIP abolished; severity preserved. `codd validate` reports policy violations. See [post-mortem](docs/post-mortems/optout_loophole.md).
118
- - **v2.12.0** — Test-completeness gates: C7 `actors_without_journeys` amber promotion + new C8 `ci_health` static check (workflow presence, trigger coverage, verification-in-workflow). See [post-mortem](docs/post-mortems/test_completeness_gap.md).
119
- - **v2.11.0** — Sprint-less `codd implement` (`--design <path> --output <dir>` directly; `implementation_plan.md` parser removed). See [migration guide](docs/migrations/v2.11.0-sprintless.md).
120
- - **v2.15.0 (next)** — C8 `ci_health` runtime mode (opt-in `ci.runtime_check: true`) polling the CI provider for latest-run-on-default-branch success.
116
+ - **v2.16.0 (current)** — `codd fix [PHENOMENON]` North Star entry-point 2 (cmd_468). Express a desired change in natural language; CoDD identifies affected design docs via Tier-1 lexicon + Tier-2 semantic scoring, updates them with LLM, runs the DAG verify gate. Full interactive HITL (candidate selection, ambiguity clarification, risk confirmation) with `--non-interactive` for CI. 66 new tests, 2908 total PASS, SKIP=0. See [CHANGELOG](CHANGELOG.md).
117
+ - **v2.15.0** — `kind: common` for shared infrastructure (cmd_467). C5 amber −79.2% on dogfood LMS (125 26). `**` glob translator fix.
118
+ - **v2.14.0** — 8 structural gaps closed (cmd_466 dogfood). Sidecar `<test>.codd.yaml` with `verified_by:` (C6) / `axis_matrix:` (C9); lexicon schema SSoT; completeness_audit batch; `scan.exclude` bug fix (−52%); `codd dag verify --auto-repair`; elicit mock-AI sentinel; AI timeout 3600 s SSoT. Red 22 → 0.
119
+ - **v2.13.0** — Opt-out protection: `OptOutPolicy` requires `justification` + `expires_at`. Silent SKIP abolished; severity preserved.
120
+ - **v2.12.0** — Test-completeness gates: C7 amber promotion + C8 `ci_health` static check.
121
+ - **v2.11.0** — Sprint-less `codd implement` (`--design <path> --output <dir>` directly).
122
+ - **v2.17.0 (next)** — impl/test auto-propagation from PHENOMENON (AC #8 completion); Codex wrapper for PHENOMENON mode.
121
123
 
122
124
  ---
123
125
 
@@ -3333,6 +3333,7 @@ def risk(path: str):
3333
3333
 
3334
3334
 
3335
3335
  @main.command()
3336
+ @click.argument("phenomenon", nargs=-1)
3336
3337
  @click.option("--path", default=".", help="Project root directory")
3337
3338
  @click.option("--max-attempts", default=3, type=click.IntRange(min=1, max=10),
3338
3339
  help="Maximum fix attempts (default: 3)")
@@ -3345,32 +3346,73 @@ def risk(path: str):
3345
3346
  @click.option("--no-push", is_flag=True, help="Don't push fixes after successful fix")
3346
3347
  @click.option("--dry-run", is_flag=True, help="Show what would be fixed without making changes")
3347
3348
  @click.option("--ai-cmd", default=None, help="Override AI CLI command")
3348
- def fix(path: str, max_attempts: int, test_results: str | None, ci_log: str | None,
3349
- ci_only: bool, local_only: bool, no_push: bool, dry_run: bool, ai_cmd: str | None):
3350
- """Fix test/build failures using AI guided by design documents.
3349
+ @click.option("--non-interactive", is_flag=True,
3350
+ help="PHENOMENON mode: disable interactive prompts (use defaults)")
3351
+ @click.option("--on-ambiguity",
3352
+ type=click.Choice(["abort", "default", "top1"]),
3353
+ default="abort",
3354
+ show_default=True,
3355
+ help="PHENOMENON mode: behavior when candidates are ambiguous in --non-interactive")
3356
+ @click.option("--allow-delete", is_flag=True,
3357
+ help="PHENOMENON mode: allow design_doc to lose existing acceptance criteria / user journeys")
3358
+ def fix(phenomenon: tuple[str, ...], path: str, max_attempts: int,
3359
+ test_results: str | None, ci_log: str | None,
3360
+ ci_only: bool, local_only: bool, no_push: bool, dry_run: bool,
3361
+ ai_cmd: str | None, non_interactive: bool, on_ambiguity: str,
3362
+ allow_delete: bool):
3363
+ """Fix test/build failures or a user-described PHENOMENON.
3351
3364
 
3352
3365
  \b
3353
- Auto-detects failure source (in order):
3366
+ Two modes:
3367
+ codd fix # legacy: auto-detect failures
3368
+ codd fix "ログインがわかりにくい" # PHENOMENON mode
3369
+
3370
+ \b
3371
+ Legacy mode (no positional argument) auto-detects failure source:
3354
3372
  1. Explicit --test-results / --ci-log files
3355
3373
  2. CI failures via `gh run view`
3356
3374
  3. Local test execution
3357
-
3358
- Maps failures to relevant design documents via the dependency graph,
3375
+ Maps failures to relevant design docs via the dependency graph,
3359
3376
  then invokes Claude Code to fix implementation code.
3360
3377
 
3378
+ \b
3379
+ PHENOMENON mode (with positional argument) drives the second entry
3380
+ point of CoDD's north star: starting from a phenomenon the user wants
3381
+ fixed, CoDD updates the design doc, propagates the change, and
3382
+ verifies — the user touches nothing. Argument-less invocation
3383
+ remains completely unchanged.
3384
+
3361
3385
  \b
3362
3386
  Examples:
3363
- codd fix # auto-detect and fix
3364
- codd fix --ci # fix latest CI failure
3365
- codd fix --local # run tests locally and fix
3366
- codd fix --dry-run # show plan without fixing
3367
- codd fix --no-push # fix but don't push
3387
+ codd fix # auto-detect and fix
3388
+ codd fix --ci # fix latest CI failure
3389
+ codd fix --local # run tests locally and fix
3390
+ codd fix --dry-run # show plan without fixing
3391
+ codd fix --no-push # fix but don't push
3392
+ codd fix "ログインエラーをわかりやすくしたい" # PHENOMENON mode
3393
+ codd fix "Button needs aria-label" --non-interactive
3368
3394
  """
3369
- from codd.fixer import run_fix
3370
-
3371
3395
  project_root = Path(path).resolve()
3372
3396
  _require_codd_dir(project_root)
3373
3397
 
3398
+ phenomenon_text = " ".join(phenomenon).strip()
3399
+
3400
+ if phenomenon_text:
3401
+ _run_phenomenon_fix_cli(
3402
+ project_root,
3403
+ phenomenon_text,
3404
+ ai_cmd=ai_cmd,
3405
+ max_attempts=max_attempts,
3406
+ non_interactive=non_interactive,
3407
+ on_ambiguity=on_ambiguity,
3408
+ allow_delete=allow_delete,
3409
+ dry_run=dry_run,
3410
+ push=not no_push,
3411
+ )
3412
+ return
3413
+
3414
+ from codd.fixer import run_fix
3415
+
3374
3416
  if ci_only and local_only:
3375
3417
  click.echo("Error: --ci and --local are mutually exclusive.")
3376
3418
  raise SystemExit(1)
@@ -3427,6 +3469,87 @@ def fix(path: str, max_attempts: int, test_results: str | None, ci_log: str | No
3427
3469
  raise SystemExit(1)
3428
3470
 
3429
3471
 
3472
+ def _run_phenomenon_fix_cli(
3473
+ project_root: Path,
3474
+ phenomenon_text: str,
3475
+ *,
3476
+ ai_cmd: str | None,
3477
+ max_attempts: int,
3478
+ non_interactive: bool,
3479
+ on_ambiguity: str,
3480
+ allow_delete: bool,
3481
+ dry_run: bool,
3482
+ push: bool,
3483
+ ) -> None:
3484
+ """CLI adapter for the PHENOMENON-mode fix pipeline."""
3485
+ from codd.fix import run_phenomenon_fix
3486
+
3487
+ if dry_run:
3488
+ click.echo("🔍 Dry run — analyzing phenomenon without applying changes...")
3489
+ click.echo(f"🩺 Phenomenon: {phenomenon_text}")
3490
+
3491
+ result = run_phenomenon_fix(
3492
+ project_root,
3493
+ phenomenon_text,
3494
+ ai_command=ai_cmd,
3495
+ non_interactive=non_interactive,
3496
+ on_ambiguity=on_ambiguity,
3497
+ max_attempts=max_attempts,
3498
+ dry_run=dry_run,
3499
+ push=push,
3500
+ allow_delete=allow_delete,
3501
+ )
3502
+
3503
+ if result.analysis is not None:
3504
+ a = result.analysis
3505
+ click.echo(
3506
+ f" intent={a.intent}, ambiguity={a.ambiguity_score:.2f}, "
3507
+ f"subject_terms={a.subject_terms[:4]}"
3508
+ )
3509
+
3510
+ if result.aborted:
3511
+ click.echo(f"❌ Aborted: {result.abort_reason}")
3512
+ raise SystemExit(1)
3513
+
3514
+ if result.selection is not None:
3515
+ cands = result.selection.candidates
3516
+ click.echo(f" {len(cands)} candidate design doc(s) considered.")
3517
+
3518
+ if not result.attempts:
3519
+ click.echo("ℹ️ No candidate produced a usable update.")
3520
+ raise SystemExit(1)
3521
+
3522
+ applied_any = False
3523
+ for att in result.attempts:
3524
+ status = "✅" if att.applied else ("🔸" if att.aborted_reason == "dry_run: not applying" else "❌")
3525
+ target_id = att.target.node_id if att.target else "(no target)"
3526
+ click.echo(f"{status} Attempt {att.attempt} on {target_id}")
3527
+ if att.update is not None and att.update.diff:
3528
+ for line in att.update.diff.splitlines()[:40]:
3529
+ click.echo(f" {line}")
3530
+ extra = len(att.update.diff.splitlines()) - 40
3531
+ if extra > 0:
3532
+ click.echo(f" ... (+{extra} more diff lines)")
3533
+ if att.risk is not None and att.risk.risky:
3534
+ click.echo(f" ⚠️ risk: {', '.join(att.risk.categories) or 'unspecified'} — {att.risk.summary}")
3535
+ if att.aborted_reason:
3536
+ click.echo(f" reason: {att.aborted_reason}")
3537
+ if att.applied:
3538
+ applied_any = True
3539
+
3540
+ if dry_run:
3541
+ click.echo("\n🔎 Dry run complete — no files were modified.")
3542
+ return
3543
+
3544
+ if applied_any:
3545
+ click.echo(f"\n✅ Updated {len(result.applied_paths)} design doc(s): "
3546
+ f"{', '.join(result.applied_paths)}")
3547
+ click.echo(" Review the diff above and commit when satisfied.")
3548
+ else:
3549
+ click.echo("\n❌ No design doc was updated.")
3550
+ raise SystemExit(1)
3551
+
3552
+
3430
3553
  @main.command()
3431
3554
  @click.option("--path", default=".", help="Project root directory")
3432
3555
  def policy(path: str):
@@ -5275,6 +5398,9 @@ def _dag_result_details(result: Any) -> list[str]:
5275
5398
  details.append(f"{key}: {rendered}")
5276
5399
  else:
5277
5400
  details.append(f"{key}: {value}")
5401
+ common_count = _dag_result_value(result, "common_node_count")
5402
+ if isinstance(common_count, int) and common_count > 0:
5403
+ details.append(f"common_node_count: {common_count}")
5278
5404
  return details
5279
5405
 
5280
5406
 
@@ -125,11 +125,14 @@ def load_dag_settings(project_root: Path, settings: dict[str, Any] | None = None
125
125
  merged["test_suffixes"] = test_suffixes
126
126
  _apply_scan_patterns(merged, project_config)
127
127
  _apply_scan_patterns(merged, requested_settings)
128
+ _apply_common_node_patterns(merged, project_config)
129
+ _apply_common_node_patterns(merged, requested_settings)
128
130
  merged["coherence"] = _coherence_settings(project_config, requested_settings)
129
131
  merged["extraction"] = _extraction_settings(project_config, requested_settings)
130
132
  merged.setdefault("design_doc_patterns", [])
131
133
  merged.setdefault("impl_file_patterns", [])
132
134
  merged.setdefault("test_file_patterns", [])
135
+ merged.setdefault("common_node_patterns", [])
133
136
  # cmd_444 v2.11.0: implementation_plan.md is no longer the entry point.
134
137
  # `codd implement` now takes design_node + output_paths directly. Any
135
138
  # `plan_task_file` value present in legacy codd.yaml is silently ignored.
@@ -233,11 +236,16 @@ def _add_design_docs(dag: DAG, project_root: Path, settings: dict[str, Any]) ->
233
236
  metadata = extract_design_doc_metadata(md_path, frontmatter_alias=frontmatter_alias)
234
237
  attributes = metadata.get("attributes") or {}
235
238
  _validate_design_doc_journey_attributes(node_id, attributes)
239
+ node_kind = (
240
+ "common"
241
+ if _design_doc_declares_common(metadata.get("frontmatter"), attributes)
242
+ else "design_doc"
243
+ )
236
244
  _add_node_once(
237
245
  dag,
238
246
  Node(
239
247
  id=node_id,
240
- kind="design_doc",
248
+ kind=node_kind,
241
249
  path=node_id,
242
250
  attributes={
243
251
  "frontmatter": metadata["frontmatter"],
@@ -260,6 +268,8 @@ def _add_impl_files(dag: DAG, project_root: Path, settings: dict[str, Any]) -> d
260
268
  impl_nodes: dict[str, Path] = {}
261
269
  capability_patterns = _capability_patterns(settings)
262
270
  implementation_suffixes = _suffix_tuple(settings.get("implementation_suffixes")) or LEGACY_IMPLEMENTATION_SUFFIXES
271
+ common_patterns = _common_node_patterns(settings)
272
+ project_root_resolved = Path(project_root).resolve()
263
273
  for file_path in _glob_project_paths(
264
274
  project_root,
265
275
  settings.get("impl_file_patterns", []),
@@ -273,11 +283,16 @@ def _add_impl_files(dag: DAG, project_root: Path, settings: dict[str, Any]) -> d
273
283
  continue
274
284
  node_id = _relative_id(file_path, project_root)
275
285
  impl_nodes[node_id] = file_path.resolve()
286
+ kind = "impl_file"
287
+ if common_patterns and _path_matches_any_pattern(
288
+ file_path, project_root_resolved, common_patterns
289
+ ):
290
+ kind = "common"
276
291
  _add_node_once(
277
292
  dag,
278
293
  Node(
279
294
  id=node_id,
280
- kind="impl_file",
295
+ kind=kind,
281
296
  path=node_id,
282
297
  attributes={
283
298
  "language": _language_for_path(file_path),
@@ -292,6 +307,8 @@ def _add_impl_files(dag: DAG, project_root: Path, settings: dict[str, Any]) -> d
292
307
  def _add_test_files(dag: DAG, project_root: Path, settings: dict[str, Any]) -> dict[str, Path]:
293
308
  test_nodes: dict[str, Path] = {}
294
309
  test_suffixes = _suffix_tuple(settings.get("test_suffixes")) or LEGACY_TEST_SUFFIXES
310
+ common_patterns = _common_node_patterns(settings)
311
+ project_root_resolved = Path(project_root).resolve()
295
312
  for file_path in _glob_project_paths(
296
313
  project_root,
297
314
  settings.get("test_file_patterns", []),
@@ -301,11 +318,16 @@ def _add_test_files(dag: DAG, project_root: Path, settings: dict[str, Any]) -> d
301
318
  continue
302
319
  node_id = _relative_id(file_path, project_root)
303
320
  test_nodes[node_id] = file_path.resolve()
321
+ kind = "test_file"
322
+ if common_patterns and _path_matches_any_pattern(
323
+ file_path, project_root_resolved, common_patterns
324
+ ):
325
+ kind = "common"
304
326
  _add_node_once(
305
327
  dag,
306
328
  Node(
307
329
  id=node_id,
308
- kind="test_file",
330
+ kind=kind,
309
331
  path=node_id,
310
332
  attributes={
311
333
  "language": _language_for_path(file_path),
@@ -1118,44 +1140,60 @@ def _path_matches_any_pattern(
1118
1140
  except ValueError:
1119
1141
  return False
1120
1142
  rel_text = relative.as_posix()
1121
- parts = relative.parts
1122
1143
 
1123
1144
  for pattern in patterns:
1124
- if fnmatch.fnmatch(rel_text, pattern):
1145
+ if _glob_pattern_to_regex(pattern).match(rel_text):
1125
1146
  return True
1126
- # Honour shell-style "any depth" wildcards by stripping the outer
1127
- # ``**/`` and ``/**`` decorations and looking for the inner pattern
1128
- # against any path slice. Examples:
1129
- # **/node_modules/** -> "node_modules" must appear as a path component
1130
- # **/dist/** -> "dist" must appear as a path component
1131
- # src/**/*.py -> not stripped here; falls back to fnmatch above
1132
- inner = pattern
1133
- stripped = True
1134
- while stripped:
1135
- stripped = False
1136
- if inner.startswith("**/"):
1137
- inner = inner[3:]
1138
- stripped = True
1139
- if inner.endswith("/**"):
1140
- inner = inner[:-3]
1141
- stripped = True
1142
- if not inner or inner == pattern:
1143
- continue
1144
- if "/" not in inner and "*" not in inner:
1145
- if inner in parts:
1146
- return True
1147
- continue
1148
- # Inner still contains glob syntax: check every contiguous slice of
1149
- # the relative path against ``inner`` so e.g. ``a/b/c/d`` matches
1150
- # ``a/b`` or ``c/d`` etc.
1151
- for start in range(len(parts)):
1152
- for end in range(start + 1, len(parts) + 1):
1153
- candidate = "/".join(parts[start:end])
1154
- if fnmatch.fnmatch(candidate, inner):
1155
- return True
1156
1147
  return False
1157
1148
 
1158
1149
 
1150
+ _GLOB_REGEX_CACHE: dict[str, "re.Pattern[str]"] = {}
1151
+
1152
+
1153
+ def _glob_pattern_to_regex(pattern: str) -> "re.Pattern[str]":
1154
+ """Translate a glob pattern (with ``**`` recursion) into a regex.
1155
+
1156
+ Recognised tokens:
1157
+
1158
+ * ``**/`` — zero or more path segments (greedy across separators).
1159
+ * ``**`` — anything (including ``/``); used at end of a pattern.
1160
+ * ``*`` — any chars except ``/``.
1161
+ * ``?`` — single char except ``/``.
1162
+ * Anything else — literal.
1163
+
1164
+ Patterns such as ``**/dist/**`` match a path containing ``dist`` at any
1165
+ depth, ``src/lib/**/*.ts`` matches both ``src/lib/x.ts`` and
1166
+ ``src/lib/sub/x.ts``.
1167
+ """
1168
+
1169
+ cached = _GLOB_REGEX_CACHE.get(pattern)
1170
+ if cached is not None:
1171
+ return cached
1172
+
1173
+ parts: list[str] = []
1174
+ i = 0
1175
+ n = len(pattern)
1176
+ while i < n:
1177
+ if pattern[i : i + 3] == "**/":
1178
+ parts.append("(?:[^/]+/)*")
1179
+ i += 3
1180
+ elif pattern[i : i + 2] == "**":
1181
+ parts.append(".*")
1182
+ i += 2
1183
+ elif pattern[i] == "*":
1184
+ parts.append("[^/]*")
1185
+ i += 1
1186
+ elif pattern[i] == "?":
1187
+ parts.append("[^/]")
1188
+ i += 1
1189
+ else:
1190
+ parts.append(re.escape(pattern[i]))
1191
+ i += 1
1192
+ compiled = re.compile("^" + "".join(parts) + "$")
1193
+ _GLOB_REGEX_CACHE[pattern] = compiled
1194
+ return compiled
1195
+
1196
+
1159
1197
  def _expand_braces(pattern: str) -> list[str]:
1160
1198
  match = re.search(r"\{([^{}]+)\}", pattern)
1161
1199
  if not match:
@@ -1365,6 +1403,80 @@ def _capability_patterns(settings: dict[str, Any]) -> dict[str, Any]:
1365
1403
  return patterns if isinstance(patterns, dict) else {}
1366
1404
 
1367
1405
 
1406
+ def _apply_common_node_patterns(settings: dict[str, Any], config: dict[str, Any]) -> None:
1407
+ """Capture ``common_node_patterns`` from project / requested config.
1408
+
1409
+ Recognises both ``common_node_patterns:`` at the top level (preferred,
1410
+ sibling of ``scan:``) and ``scan.common_node_patterns:`` (nested under
1411
+ scan for users who prefer to colocate scan-related knobs). Both feed
1412
+ the same ``settings['common_node_patterns']`` list.
1413
+ """
1414
+
1415
+ if not isinstance(config, dict):
1416
+ return
1417
+ patterns: list[str] = []
1418
+ top = config.get("common_node_patterns")
1419
+ if isinstance(top, list):
1420
+ patterns.extend(
1421
+ str(item) for item in top if isinstance(item, str) and item.strip()
1422
+ )
1423
+ scan = config.get("scan")
1424
+ if isinstance(scan, dict):
1425
+ nested = scan.get("common_node_patterns")
1426
+ if isinstance(nested, list):
1427
+ patterns.extend(
1428
+ str(item) for item in nested if isinstance(item, str) and item.strip()
1429
+ )
1430
+ if patterns:
1431
+ _extend_unique(settings, "common_node_patterns", patterns)
1432
+
1433
+
1434
+ def _design_doc_declares_common(
1435
+ frontmatter: Any, attributes: Any
1436
+ ) -> bool:
1437
+ """Return True when a design doc opts into ``kind="common"`` via frontmatter.
1438
+
1439
+ Recognised keys (any one wins):
1440
+ * ``codd.node_type`` (preferred, lives under the ``codd:`` block)
1441
+ * top-level ``node_type`` (legacy / convenience)
1442
+ """
1443
+
1444
+ for source in (frontmatter, attributes):
1445
+ if not isinstance(source, dict):
1446
+ continue
1447
+ node_type = source.get("node_type")
1448
+ if isinstance(node_type, str) and node_type.strip().lower() == "common":
1449
+ return True
1450
+ codd_block = source.get("codd")
1451
+ if isinstance(codd_block, dict):
1452
+ value = codd_block.get("node_type")
1453
+ if isinstance(value, str) and value.strip().lower() == "common":
1454
+ return True
1455
+ return False
1456
+
1457
+
1458
+ def _common_node_patterns(settings: dict[str, Any]) -> list[str]:
1459
+ """Return glob patterns that should be classified as ``kind='common'``.
1460
+
1461
+ Common nodes represent shared infrastructure (DB clients, middleware,
1462
+ framework config, generated artifacts) that exist outside any single
1463
+ design document's scope. They participate in the DAG so that change
1464
+ impact can be traced, but they are exempt from C5 transitive_closure
1465
+ unreachable_nodes since requiring every common file to have a parent
1466
+ design_doc would force the entire codebase to be re-modelled as a tree.
1467
+ """
1468
+
1469
+ raw = settings.get("common_node_patterns")
1470
+ if not isinstance(raw, list):
1471
+ return []
1472
+ expanded: list[str] = []
1473
+ for pattern in raw:
1474
+ if not isinstance(pattern, str) or not pattern.strip():
1475
+ continue
1476
+ expanded.extend(_expand_braces(pattern.strip()))
1477
+ return expanded
1478
+
1479
+
1368
1480
  def _runtime_evidence_for_file(file_path: Path, node_id: str, capability_patterns: dict[str, Any]) -> list[dict]:
1369
1481
  evidence = scan_capability_evidence(file_path, capability_patterns)
1370
1482
  absolute_prefix = f"{file_path.as_posix()}:"
@@ -15,12 +15,20 @@ class TransitiveClosureResult:
15
15
  check_name: str = "transitive_closure"
16
16
  severity: str = "amber"
17
17
  unreachable_nodes: list[str] = field(default_factory=list)
18
+ common_node_count: int = 0
18
19
  passed: bool = True
19
20
 
20
21
 
21
22
  @register_dag_check("transitive_closure")
22
23
  class TransitiveClosureCheck:
23
- """Report nodes unreachable from root design docs without blocking deploy."""
24
+ """Report nodes unreachable from root design docs without blocking deploy.
25
+
26
+ Nodes with ``kind == "common"`` (shared infrastructure declared via
27
+ ``common_node_patterns`` or frontmatter ``node_type: common``) are exempt
28
+ from unreachable detection. They participate in the DAG so change-impact
29
+ analysis still sees them, but they do not need to be the descendant of a
30
+ single design document.
31
+ """
24
32
 
25
33
  def __init__(self, dag=None, project_root: Path | None = None, settings: dict[str, Any] | None = None):
26
34
  self.dag = dag
@@ -45,8 +53,19 @@ class TransitiveClosureCheck:
45
53
  ]
46
54
 
47
55
  visited = self._reachable_from(dag, roots)
48
- unreachable = [node_id for node_id in dag.nodes if node_id not in visited]
49
- return TransitiveClosureResult(unreachable_nodes=unreachable, passed=True)
56
+ common_count = sum(
57
+ 1 for node in dag.nodes.values() if node.kind == "common"
58
+ )
59
+ unreachable = [
60
+ node_id
61
+ for node_id, node in dag.nodes.items()
62
+ if node_id not in visited and node.kind != "common"
63
+ ]
64
+ return TransitiveClosureResult(
65
+ unreachable_nodes=unreachable,
66
+ common_node_count=common_count,
67
+ passed=True,
68
+ )
50
69
 
51
70
  def _reachable_from(self, dag, roots: list[str]) -> set[str]:
52
71
  visited: set[str] = set()
@@ -0,0 +1,22 @@
1
+ """CoDD fix — PHENOMENON-driven (operational feedback) mode.
2
+
3
+ Implements the second entry point of CoDD's north star:
4
+ "Given a phenomenon the user wants fixed, CoDD updates the design doc,
5
+ implementation, and tests in one shot — the user touches nothing."
6
+
7
+ The existing `codd fix` (argument-less, test/CI failure driven) is the
8
+ first entry point. This package adds the second one as an additive,
9
+ opt-in code path. The legacy run_fix() is not modified.
10
+ """
11
+
12
+ from codd.fix.phenomenon_fixer import (
13
+ PhenomenonFixResult,
14
+ PhenomenonFixAttempt,
15
+ run_phenomenon_fix,
16
+ )
17
+
18
+ __all__ = [
19
+ "PhenomenonFixResult",
20
+ "PhenomenonFixAttempt",
21
+ "run_phenomenon_fix",
22
+ ]