codd-dev 2.47.0__tar.gz → 2.48.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 (582) hide show
  1. {codd_dev-2.47.0 → codd_dev-2.48.0}/PKG-INFO +1 -1
  2. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/__init__.py +1 -1
  3. codd_dev-2.48.0/codd/e2e_harness.py +291 -0
  4. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/vb_marker_authenticity.py +119 -2
  5. {codd_dev-2.47.0 → codd_dev-2.48.0}/pyproject.toml +1 -1
  6. codd_dev-2.47.0/codd/e2e_harness.py +0 -177
  7. {codd_dev-2.47.0 → codd_dev-2.48.0}/.gitignore +0 -0
  8. {codd_dev-2.47.0 → codd_dev-2.48.0}/LICENSE +0 -0
  9. {codd_dev-2.47.0 → codd_dev-2.48.0}/README.md +0 -0
  10. {codd_dev-2.47.0 → codd_dev-2.48.0}/bench_fixture/README.md +0 -0
  11. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/__main__.py +0 -0
  12. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/_git_helper.py +0 -0
  13. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/action_outcome.py +0 -0
  14. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/ai_invoke.py +0 -0
  15. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/ai_patch.py +0 -0
  16. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/artifact_contract.py +0 -0
  17. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/artifact_ids.py +0 -0
  18. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/artifacts/catalog.yaml +0 -0
  19. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/ask_user_question_adapter.py +0 -0
  20. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/assembler.py +0 -0
  21. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/bridge.py +0 -0
  22. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/brownfield/__init__.py +0 -0
  23. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/brownfield/pipeline.py +0 -0
  24. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/capability_completeness.py +0 -0
  25. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/claude_cli.py +0 -0
  26. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/cli.py +0 -0
  27. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/clustering.py +0 -0
  28. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/coherence_adapters.py +0 -0
  29. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/coherence_engine.py +0 -0
  30. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/confidence.py +0 -0
  31. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/config.py +0 -0
  32. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/config_schema.py +0 -0
  33. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/contracts.py +0 -0
  34. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/contracts_registry/__init__.py +0 -0
  35. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/contracts_registry/__main__.py +0 -0
  36. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/contracts_registry/certify.py +0 -0
  37. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/contracts_registry/generate_matrix.py +0 -0
  38. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/contracts_registry/registry.py +0 -0
  39. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/coverage_auditor.py +0 -0
  40. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/coverage_execution_coherence.py +0 -0
  41. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/coverage_metrics.py +0 -0
  42. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/dag/__init__.py +0 -0
  43. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/dag/auto_repair.py +0 -0
  44. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/dag/builder.py +0 -0
  45. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/dag/checks/__init__.py +0 -0
  46. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/dag/checks/_one_to_many_detection.py +0 -0
  47. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/dag/checks/artifact_contract_check.py +0 -0
  48. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/dag/checks/ci_health.py +0 -0
  49. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/dag/checks/dependency_freshness.py +0 -0
  50. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/dag/checks/depends_on_consistency.py +0 -0
  51. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/dag/checks/deployment_completeness.py +0 -0
  52. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/dag/checks/edge_validity.py +0 -0
  53. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/dag/checks/environment_coverage.py +0 -0
  54. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/dag/checks/implementation_coverage.py +0 -0
  55. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/dag/checks/node_completeness.py +0 -0
  56. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/dag/checks/opt_out.py +0 -0
  57. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/dag/checks/task_completion.py +0 -0
  58. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/dag/checks/transitive_closure.py +0 -0
  59. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/dag/checks/ui_coherence.py +0 -0
  60. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/dag/checks/user_journey_coherence.py +0 -0
  61. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/dag/coverage_axes.py +0 -0
  62. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/dag/defaults/cli.yaml +0 -0
  63. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/dag/defaults/cpp_embedded.yaml +0 -0
  64. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/dag/defaults/csharp.yaml +0 -0
  65. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/dag/defaults/elixir.yaml +0 -0
  66. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/dag/defaults/generic.yaml +0 -0
  67. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/dag/defaults/iot.yaml +0 -0
  68. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/dag/defaults/java.yaml +0 -0
  69. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/dag/defaults/kotlin.yaml +0 -0
  70. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/dag/defaults/mobile.yaml +0 -0
  71. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/dag/defaults/ruby.yaml +0 -0
  72. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/dag/defaults/rust.yaml +0 -0
  73. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/dag/defaults/scala.yaml +0 -0
  74. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/dag/defaults/swift.yaml +0 -0
  75. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/dag/defaults/test_frameworks.yaml +0 -0
  76. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/dag/defaults/web.yaml +0 -0
  77. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/dag/extractor.py +0 -0
  78. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/dag/impact.py +0 -0
  79. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/dag/runner.py +0 -0
  80. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/defaults.py +0 -0
  81. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/defaults.yaml +0 -0
  82. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/dependency_lock_coherence.py +0 -0
  83. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/deploy_targets/__init__.py +0 -0
  84. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/deploy_targets/app_service.py +0 -0
  85. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/deploy_targets/base.py +0 -0
  86. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/deploy_targets/docker_compose.py +0 -0
  87. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/deployer.py +0 -0
  88. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/deployment/__init__.py +0 -0
  89. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/deployment/checks/__init__.py +0 -0
  90. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/deployment/defaults/deploy_targets.yaml +0 -0
  91. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/deployment/defaults/runtime_capability_inference.yaml +0 -0
  92. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/deployment/defaults/schema_providers.yaml +0 -0
  93. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/deployment/defaults/verification_templates.yaml +0 -0
  94. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/deployment/extractor.py +0 -0
  95. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/deployment/providers/__init__.py +0 -0
  96. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/deployment/providers/ai_command.py +0 -0
  97. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/deployment/providers/ai_command_factory.py +0 -0
  98. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/deployment/providers/codex_app_server.py +0 -0
  99. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/deployment/providers/llm_consideration.py +0 -0
  100. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/deployment/providers/schema/__init__.py +0 -0
  101. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/deployment/providers/schema/prisma.py +0 -0
  102. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/deployment/providers/target/__init__.py +0 -0
  103. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/deployment/providers/target/docker_compose.py +0 -0
  104. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/deployment/providers/verification/__init__.py +0 -0
  105. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/deployment/providers/verification/assertion_handlers.py +0 -0
  106. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/deployment/providers/verification/cdp_browser.py +0 -0
  107. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/deployment/providers/verification/cdp_engines.py +0 -0
  108. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/deployment/providers/verification/cdp_launchers.py +0 -0
  109. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/deployment/providers/verification/cdp_wire.py +0 -0
  110. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/deployment/providers/verification/curl.py +0 -0
  111. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/deployment/providers/verification/form_strategies.py +0 -0
  112. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/deployment/providers/verification/means_catalog.py +0 -0
  113. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/deployment/providers/verification/playwright.py +0 -0
  114. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/deployment/providers/verification/pytest_http.py +0 -0
  115. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/deployment/providers/verification/vitest.py +0 -0
  116. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/design_md.py +0 -0
  117. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/diff/__init__.py +0 -0
  118. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/diff/apply.py +0 -0
  119. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/diff/engine.py +0 -0
  120. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/diff/persistence.py +0 -0
  121. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/diff/templates/diff_prompt.md +0 -0
  122. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/discovery.py +0 -0
  123. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/drift.py +0 -0
  124. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/e2e_contract_coherence.py +0 -0
  125. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/e2e_extractor.py +0 -0
  126. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/e2e_generator.py +0 -0
  127. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/e2e_runner.py +0 -0
  128. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/elicit/__init__.py +0 -0
  129. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/elicit/apply.py +0 -0
  130. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/elicit/engine.py +0 -0
  131. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/elicit/finding.py +0 -0
  132. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/elicit/formatters/__init__.py +0 -0
  133. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/elicit/formatters/base.py +0 -0
  134. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/elicit/formatters/interactive.py +0 -0
  135. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/elicit/formatters/json_fmt.py +0 -0
  136. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/elicit/formatters/md.py +0 -0
  137. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/elicit/lexicon_loader.py +0 -0
  138. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/elicit/persistence.py +0 -0
  139. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/elicit/templates/elicit_prompt_L0.md +0 -0
  140. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/env_refs.py +0 -0
  141. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/extract_ai.py +0 -0
  142. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/extract_paths.py +0 -0
  143. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/extractor.py +0 -0
  144. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/fix/__init__.py +0 -0
  145. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/fix/candidate_selector.py +0 -0
  146. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/fix/design_updater.py +0 -0
  147. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/fix/impl_propagation.py +0 -0
  148. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/fix/interactive_prompt.py +0 -0
  149. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/fix/phenomenon_fixer.py +0 -0
  150. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/fix/phenomenon_parser.py +0 -0
  151. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/fix/risk_classifier.py +0 -0
  152. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/fix/templates/clarification_question.txt +0 -0
  153. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/fix/templates/design_update.txt +0 -0
  154. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/fix/templates/impl_update.txt +0 -0
  155. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/fix/templates/phenomenon_parse.txt +0 -0
  156. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/fix/templates/risk_assessment.txt +0 -0
  157. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/fix/templates_loader.py +0 -0
  158. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/fixer.py +0 -0
  159. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/fixup_drift.py +0 -0
  160. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/fixup_drift_strategies/__init__.py +0 -0
  161. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/fixup_drift_strategies/design_token_drift.py +0 -0
  162. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/fixup_drift_strategies/lexicon_violation.py +0 -0
  163. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/fixup_drift_strategies/url_drift.py +0 -0
  164. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/frontmatter.py +0 -0
  165. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/generator.py +0 -0
  166. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/git_evidence.py +0 -0
  167. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/graph.py +0 -0
  168. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/greenfield/__init__.py +0 -0
  169. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/greenfield/pipeline.py +0 -0
  170. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/hitl_session.py +0 -0
  171. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/hooks/__init__.py +0 -0
  172. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/hooks/pre-commit +0 -0
  173. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/hooks/recipes/claude_requirements_nudge.json +0 -0
  174. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/hooks/recipes/claude_settings_example.json +0 -0
  175. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/hooks/recipes/codex_hook.sh +0 -0
  176. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/hooks/recipes/git_post_commit.sh +0 -0
  177. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/hooks/recipes/git_pre_commit.sh +0 -0
  178. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/iac_nfr.py +0 -0
  179. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/implement_oracle.py +0 -0
  180. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/implement_oracle_scope.py +0 -0
  181. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/implementer/__init__.py +0 -0
  182. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/implementer/chunked_runner.py +0 -0
  183. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/implementer/typecheck_loop.py +0 -0
  184. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/implementer.py +0 -0
  185. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/import_coherence.py +0 -0
  186. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/inheritance.py +0 -0
  187. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/init/__init__.py +0 -0
  188. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/init/lexicon_suggest.py +0 -0
  189. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/init/llm_lexicon_suggester.py +0 -0
  190. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/init/stack_detector.py +0 -0
  191. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/knowledge_fetcher.py +0 -0
  192. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/lexicon.py +0 -0
  193. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/lexicon_cli/__init__.py +0 -0
  194. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/lexicon_cli/formatters/__init__.py +0 -0
  195. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/lexicon_cli/formatters/html.py +0 -0
  196. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/lexicon_cli/formatters/json_fmt.py +0 -0
  197. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/lexicon_cli/formatters/md.py +0 -0
  198. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/lexicon_cli/inspector.py +0 -0
  199. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/lexicon_cli/manager.py +0 -0
  200. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/lexicon_cli/reporter.py +0 -0
  201. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/lexicon_cli/threshold.py +0 -0
  202. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/llm/__init__.py +0 -0
  203. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/llm/approval.py +0 -0
  204. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/llm/best_practice_augmenter.py +0 -0
  205. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/llm/criteria_expander.py +0 -0
  206. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/llm/design_doc_extractor.py +0 -0
  207. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/llm/impl_step_deriver.py +0 -0
  208. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/llm/means_catalog_loader.py +0 -0
  209. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/llm/parser.py +0 -0
  210. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/llm/plan_deriver.py +0 -0
  211. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/llm/prompt_builder.py +0 -0
  212. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/llm/strategy_validator.py +0 -0
  213. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/llm/templates/best_practice_augment_meta.md +0 -0
  214. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/llm/templates/criteria_expand_meta.md +0 -0
  215. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/llm/templates/design_doc_extract_meta.md +0 -0
  216. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/llm/templates/impl_step_derive_meta.md +0 -0
  217. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/llm/templates/implementation_step_catalog.yaml +0 -0
  218. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/llm/templates/meta_instruction.md +0 -0
  219. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/llm/templates/plan_derive_meta.md +0 -0
  220. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/llm/templates/verification_means_catalog.yaml +0 -0
  221. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/mcp_server.py +0 -0
  222. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/measure.py +0 -0
  223. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/operational_e2e_audit.py +0 -0
  224. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/operations_derive.py +0 -0
  225. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/parsing/__init__.py +0 -0
  226. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/parsing/_shared.py +0 -0
  227. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/parsing/api_specs.py +0 -0
  228. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/parsing/filesystem_routes.py +0 -0
  229. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/parsing/iac.py +0 -0
  230. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/parsing/python_ast.py +0 -0
  231. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/parsing/schemas.py +0 -0
  232. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/parsing/tests_builddeps.py +0 -0
  233. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/parsing/treesitter.py +0 -0
  234. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/planner.py +0 -0
  235. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/policy.py +0 -0
  236. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/preflight/__init__.py +0 -0
  237. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/preflight/defaults/cli.yaml +0 -0
  238. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/preflight/defaults/generic.yaml +0 -0
  239. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/preflight/defaults/iot.yaml +0 -0
  240. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/preflight/defaults/mobile.yaml +0 -0
  241. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/preflight/defaults/web.yaml +0 -0
  242. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/project_types.py +0 -0
  243. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/propagate.py +0 -0
  244. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/propagation_common.py +0 -0
  245. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/propagator.py +0 -0
  246. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/reconciliation_ledger.py +0 -0
  247. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/reference_resolution.py +0 -0
  248. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/registry.py +0 -0
  249. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/repair/__init__.py +0 -0
  250. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/repair/approval_repair.py +0 -0
  251. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/repair/auto_scope_guard.py +0 -0
  252. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/repair/engine.py +0 -0
  253. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/repair/git_patcher.py +0 -0
  254. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/repair/history.py +0 -0
  255. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/repair/llm_repair_engine.py +0 -0
  256. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/repair/loop.py +0 -0
  257. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/repair/primary_picker.py +0 -0
  258. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/repair/proof_breaks.py +0 -0
  259. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/repair/repair_result.py +0 -0
  260. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/repair/repairability_classifier.py +0 -0
  261. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/repair/schema.py +0 -0
  262. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/repair/templates/analyze_meta.md +0 -0
  263. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/repair/templates/propose_meta.md +0 -0
  264. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/repair/templates/repair_strategy_meta.md +0 -0
  265. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/repair/templates/repairability_meta.md +0 -0
  266. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/repair/test_failure_attribution.py +0 -0
  267. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/repair/verify_runner.py +0 -0
  268. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/repair_slice.py +0 -0
  269. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/require.py +0 -0
  270. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/require_plugins.py +0 -0
  271. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/require_propagate.py +0 -0
  272. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/required_artifacts/defaults/cli.yaml +0 -0
  273. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/required_artifacts/defaults/generic.yaml +0 -0
  274. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/required_artifacts/defaults/iot.yaml +0 -0
  275. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/required_artifacts/defaults/mobile.yaml +0 -0
  276. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/required_artifacts/defaults/web.yaml +0 -0
  277. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/required_artifacts_deriver.py +0 -0
  278. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/requirement_completeness/defaults/cli.yaml +0 -0
  279. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/requirement_completeness/defaults/generic.yaml +0 -0
  280. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/requirement_completeness/defaults/iot.yaml +0 -0
  281. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/requirement_completeness/defaults/mobile.yaml +0 -0
  282. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/requirement_completeness/defaults/web.yaml +0 -0
  283. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/requirement_completeness_auditor.py +0 -0
  284. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/requirement_reconciliation.py +0 -0
  285. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/requirements_meta.py +0 -0
  286. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/restoration_report.py +0 -0
  287. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/restore.py +0 -0
  288. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/routes_extractor.py +0 -0
  289. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/runtime_smoke/__init__.py +0 -0
  290. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/runtime_smoke/checks.py +0 -0
  291. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/runtime_smoke/config.py +0 -0
  292. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/runtime_smoke/report.py +0 -0
  293. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/runtime_smoke/runner.py +0 -0
  294. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/scanner.py +0 -0
  295. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/schema_refs.py +0 -0
  296. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/screen_flow_validator.py +0 -0
  297. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/screen_transition_extractor.py +0 -0
  298. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/screen_transitions/defaults.yaml +0 -0
  299. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/skills_cli/__init__.py +0 -0
  300. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/skills_cli/discovery.py +0 -0
  301. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/skills_cli/manager.py +0 -0
  302. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/skills_cli/paths.py +0 -0
  303. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/surface_reconciliation.py +0 -0
  304. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/synth.py +0 -0
  305. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/templates/codd.yaml.tmpl +0 -0
  306. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/templates/conventions.yaml.tmpl +0 -0
  307. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/templates/data_dependencies.yaml.tmpl +0 -0
  308. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/templates/doc_links.yaml.tmpl +0 -0
  309. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/templates/extract_ai_prompt_baseline.md +0 -0
  310. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/templates/extracted/api-contract.md.j2 +0 -0
  311. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/templates/extracted/architecture-overview.md.j2 +0 -0
  312. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/templates/extracted/module-detail.md.j2 +0 -0
  313. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/templates/extracted/schema-design.md.j2 +0 -0
  314. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/templates/extracted/system-context.md.j2 +0 -0
  315. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/templates/gitignore.tmpl +0 -0
  316. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/templates/lexicon_questions.md +0 -0
  317. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/templates/lexicon_schema.yaml +0 -0
  318. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/templates/overrides.yaml.tmpl +0 -0
  319. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/test_detection.py +0 -0
  320. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/test_import_coherence.py +0 -0
  321. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/traceability.py +0 -0
  322. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/validator.py +0 -0
  323. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/vb_rerun_scope.py +0 -0
  324. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/verifiable_behavior_audit.py +0 -0
  325. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/watch/__init__.py +0 -0
  326. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/watch/events.py +0 -0
  327. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/watch/propagation_log.py +0 -0
  328. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/watch/propagation_pipeline.py +0 -0
  329. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/watch/test_runner.py +0 -0
  330. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/watch/watcher.py +0 -0
  331. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/wiring.py +0 -0
  332. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ai_governance_eu_act/coverage_matrix.md +0 -0
  333. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ai_governance_eu_act/elicit_extend.md +0 -0
  334. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ai_governance_eu_act/lexicon.yaml +0 -0
  335. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ai_governance_eu_act/manifest.yaml +0 -0
  336. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ai_governance_eu_act/recommended_kinds.yaml +0 -0
  337. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ai_governance_eu_act/severity_rules.yaml +0 -0
  338. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/api_rate_limiting_caching/coverage_matrix.md +0 -0
  339. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/api_rate_limiting_caching/elicit_extend.md +0 -0
  340. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/api_rate_limiting_caching/lexicon.yaml +0 -0
  341. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/api_rate_limiting_caching/manifest.yaml +0 -0
  342. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/api_rate_limiting_caching/recommended_kinds.yaml +0 -0
  343. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/api_rate_limiting_caching/severity_rules.yaml +0 -0
  344. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/api_rest_openapi/coverage_matrix.md +0 -0
  345. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/api_rest_openapi/elicit_extend.md +0 -0
  346. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/api_rest_openapi/lexicon.yaml +0 -0
  347. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/api_rest_openapi/manifest.yaml +0 -0
  348. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/api_rest_openapi/recommended_kinds.yaml +0 -0
  349. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/api_rest_openapi/severity_rules.yaml +0 -0
  350. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/babok/elicit_extend.md +0 -0
  351. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/babok/lexicon.yaml +0 -0
  352. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/babok/manifest.yaml +0 -0
  353. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/babok/recommended_kinds.yaml +0 -0
  354. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/babok/severity_rules.yaml +0 -0
  355. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/backend_event_cloudevents/coverage_matrix.md +0 -0
  356. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/backend_event_cloudevents/elicit_extend.md +0 -0
  357. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/backend_event_cloudevents/lexicon.yaml +0 -0
  358. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/backend_event_cloudevents/manifest.yaml +0 -0
  359. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/backend_event_cloudevents/recommended_kinds.yaml +0 -0
  360. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/backend_event_cloudevents/severity_rules.yaml +0 -0
  361. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/backend_graphql/coverage_matrix.md +0 -0
  362. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/backend_graphql/elicit_extend.md +0 -0
  363. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/backend_graphql/lexicon.yaml +0 -0
  364. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/backend_graphql/manifest.yaml +0 -0
  365. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/backend_graphql/recommended_kinds.yaml +0 -0
  366. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/backend_graphql/severity_rules.yaml +0 -0
  367. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/backend_grpc_proto/coverage_matrix.md +0 -0
  368. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/backend_grpc_proto/elicit_extend.md +0 -0
  369. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/backend_grpc_proto/lexicon.yaml +0 -0
  370. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/backend_grpc_proto/manifest.yaml +0 -0
  371. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/backend_grpc_proto/recommended_kinds.yaml +0 -0
  372. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/backend_grpc_proto/severity_rules.yaml +0 -0
  373. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/compliance_hipaa/coverage_matrix.md +0 -0
  374. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/compliance_hipaa/elicit_extend.md +0 -0
  375. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/compliance_hipaa/lexicon.yaml +0 -0
  376. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/compliance_hipaa/manifest.yaml +0 -0
  377. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/compliance_hipaa/recommended_kinds.yaml +0 -0
  378. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/compliance_hipaa/severity_rules.yaml +0 -0
  379. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/compliance_iso27001/coverage_matrix.md +0 -0
  380. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/compliance_iso27001/elicit_extend.md +0 -0
  381. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/compliance_iso27001/lexicon.yaml +0 -0
  382. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/compliance_iso27001/manifest.yaml +0 -0
  383. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/compliance_iso27001/recommended_kinds.yaml +0 -0
  384. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/compliance_iso27001/severity_rules.yaml +0 -0
  385. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/compliance_pci_dss_4/coverage_matrix.md +0 -0
  386. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/compliance_pci_dss_4/elicit_extend.md +0 -0
  387. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/compliance_pci_dss_4/lexicon.yaml +0 -0
  388. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/compliance_pci_dss_4/manifest.yaml +0 -0
  389. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/compliance_pci_dss_4/recommended_kinds.yaml +0 -0
  390. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/compliance_pci_dss_4/severity_rules.yaml +0 -0
  391. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/data_aggregation_policies/coverage_matrix.md +0 -0
  392. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/data_aggregation_policies/elicit_extend.md +0 -0
  393. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/data_aggregation_policies/lexicon.yaml +0 -0
  394. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/data_aggregation_policies/manifest.yaml +0 -0
  395. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/data_aggregation_policies/recommended_kinds.yaml +0 -0
  396. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/data_aggregation_policies/severity_rules.yaml +0 -0
  397. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/coverage_matrix.md +0 -0
  398. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/elicit_extend.md +0 -0
  399. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/lexicon.yaml +0 -0
  400. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/manifest.yaml +0 -0
  401. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/recommended_kinds.yaml +0 -0
  402. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/severity_rules.yaml +0 -0
  403. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/data_governance_appi_gdpr/coverage_matrix.md +0 -0
  404. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/data_governance_appi_gdpr/elicit_extend.md +0 -0
  405. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/data_governance_appi_gdpr/lexicon.yaml +0 -0
  406. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/data_governance_appi_gdpr/manifest.yaml +0 -0
  407. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/data_governance_appi_gdpr/recommended_kinds.yaml +0 -0
  408. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/data_governance_appi_gdpr/severity_rules.yaml +0 -0
  409. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/data_nosql_jsonschema/coverage_matrix.md +0 -0
  410. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/data_nosql_jsonschema/elicit_extend.md +0 -0
  411. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/data_nosql_jsonschema/lexicon.yaml +0 -0
  412. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/data_nosql_jsonschema/manifest.yaml +0 -0
  413. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/data_nosql_jsonschema/recommended_kinds.yaml +0 -0
  414. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/data_nosql_jsonschema/severity_rules.yaml +0 -0
  415. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/data_relational_iso_sql/coverage_matrix.md +0 -0
  416. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/data_relational_iso_sql/elicit_extend.md +0 -0
  417. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/data_relational_iso_sql/lexicon.yaml +0 -0
  418. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/data_relational_iso_sql/manifest.yaml +0 -0
  419. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/data_relational_iso_sql/recommended_kinds.yaml +0 -0
  420. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/data_relational_iso_sql/severity_rules.yaml +0 -0
  421. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ddd_domain_driven_design/coverage_matrix.md +0 -0
  422. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ddd_domain_driven_design/elicit_extend.md +0 -0
  423. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ddd_domain_driven_design/lexicon.yaml +0 -0
  424. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ddd_domain_driven_design/manifest.yaml +0 -0
  425. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ddd_domain_driven_design/recommended_kinds.yaml +0 -0
  426. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ddd_domain_driven_design/severity_rules.yaml +0 -0
  427. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/dora_sre_metrics/coverage_matrix.md +0 -0
  428. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/dora_sre_metrics/elicit_extend.md +0 -0
  429. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/dora_sre_metrics/lexicon.yaml +0 -0
  430. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/dora_sre_metrics/manifest.yaml +0 -0
  431. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/dora_sre_metrics/recommended_kinds.yaml +0 -0
  432. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/dora_sre_metrics/severity_rules.yaml +0 -0
  433. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/i18n_unicode_cldr/coverage_matrix.md +0 -0
  434. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/i18n_unicode_cldr/elicit_extend.md +0 -0
  435. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/i18n_unicode_cldr/lexicon.yaml +0 -0
  436. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/i18n_unicode_cldr/manifest.yaml +0 -0
  437. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/i18n_unicode_cldr/recommended_kinds.yaml +0 -0
  438. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/i18n_unicode_cldr/severity_rules.yaml +0 -0
  439. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ml_model_cards/coverage_matrix.md +0 -0
  440. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ml_model_cards/elicit_extend.md +0 -0
  441. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ml_model_cards/lexicon.yaml +0 -0
  442. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ml_model_cards/manifest.yaml +0 -0
  443. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ml_model_cards/recommended_kinds.yaml +0 -0
  444. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ml_model_cards/severity_rules.yaml +0 -0
  445. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/mobile_a11y_native/coverage_matrix.md +0 -0
  446. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/mobile_a11y_native/elicit_extend.md +0 -0
  447. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/mobile_a11y_native/lexicon.yaml +0 -0
  448. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/mobile_a11y_native/manifest.yaml +0 -0
  449. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/mobile_a11y_native/recommended_kinds.yaml +0 -0
  450. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/mobile_a11y_native/severity_rules.yaml +0 -0
  451. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/mobile_android_material3/coverage_matrix.md +0 -0
  452. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/mobile_android_material3/elicit_extend.md +0 -0
  453. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/mobile_android_material3/lexicon.yaml +0 -0
  454. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/mobile_android_material3/manifest.yaml +0 -0
  455. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/mobile_android_material3/recommended_kinds.yaml +0 -0
  456. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/mobile_android_material3/severity_rules.yaml +0 -0
  457. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/mobile_ios_hig/coverage_matrix.md +0 -0
  458. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/mobile_ios_hig/elicit_extend.md +0 -0
  459. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/mobile_ios_hig/lexicon.yaml +0 -0
  460. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/mobile_ios_hig/manifest.yaml +0 -0
  461. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/mobile_ios_hig/recommended_kinds.yaml +0 -0
  462. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/mobile_ios_hig/severity_rules.yaml +0 -0
  463. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/mobile_security_masvs/coverage_matrix.md +0 -0
  464. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/mobile_security_masvs/elicit_extend.md +0 -0
  465. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/mobile_security_masvs/lexicon.yaml +0 -0
  466. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/mobile_security_masvs/manifest.yaml +0 -0
  467. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/mobile_security_masvs/recommended_kinds.yaml +0 -0
  468. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/mobile_security_masvs/severity_rules.yaml +0 -0
  469. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ops_cicd_pipeline/coverage_matrix.md +0 -0
  470. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ops_cicd_pipeline/elicit_extend.md +0 -0
  471. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ops_cicd_pipeline/lexicon.yaml +0 -0
  472. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ops_cicd_pipeline/manifest.yaml +0 -0
  473. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ops_cicd_pipeline/recommended_kinds.yaml +0 -0
  474. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ops_cicd_pipeline/severity_rules.yaml +0 -0
  475. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ops_iac_terraform/coverage_matrix.md +0 -0
  476. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ops_iac_terraform/elicit_extend.md +0 -0
  477. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ops_iac_terraform/lexicon.yaml +0 -0
  478. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ops_iac_terraform/manifest.yaml +0 -0
  479. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ops_iac_terraform/recommended_kinds.yaml +0 -0
  480. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ops_iac_terraform/severity_rules.yaml +0 -0
  481. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ops_kubernetes/coverage_matrix.md +0 -0
  482. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ops_kubernetes/elicit_extend.md +0 -0
  483. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ops_kubernetes/lexicon.yaml +0 -0
  484. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ops_kubernetes/manifest.yaml +0 -0
  485. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ops_kubernetes/recommended_kinds.yaml +0 -0
  486. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ops_kubernetes/severity_rules.yaml +0 -0
  487. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ops_observability_otel/coverage_matrix.md +0 -0
  488. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ops_observability_otel/elicit_extend.md +0 -0
  489. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ops_observability_otel/lexicon.yaml +0 -0
  490. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ops_observability_otel/manifest.yaml +0 -0
  491. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ops_observability_otel/recommended_kinds.yaml +0 -0
  492. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ops_observability_otel/severity_rules.yaml +0 -0
  493. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/process_iso25010/coverage_matrix.md +0 -0
  494. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/process_iso25010/elicit_extend.md +0 -0
  495. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/process_iso25010/lexicon.yaml +0 -0
  496. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/process_iso25010/manifest.yaml +0 -0
  497. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/process_iso25010/recommended_kinds.yaml +0 -0
  498. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/process_iso25010/severity_rules.yaml +0 -0
  499. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/process_test_iso29119/coverage_matrix.md +0 -0
  500. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/process_test_iso29119/elicit_extend.md +0 -0
  501. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/process_test_iso29119/lexicon.yaml +0 -0
  502. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/process_test_iso29119/manifest.yaml +0 -0
  503. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/process_test_iso29119/recommended_kinds.yaml +0 -0
  504. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/process_test_iso29119/severity_rules.yaml +0 -0
  505. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/twelve_factor_app/coverage_matrix.md +0 -0
  506. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/twelve_factor_app/elicit_extend.md +0 -0
  507. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/twelve_factor_app/lexicon.yaml +0 -0
  508. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/twelve_factor_app/manifest.yaml +0 -0
  509. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/twelve_factor_app/recommended_kinds.yaml +0 -0
  510. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/twelve_factor_app/severity_rules.yaml +0 -0
  511. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/coverage_matrix.md +0 -0
  512. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/elicit_extend.md +0 -0
  513. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/lexicon.yaml +0 -0
  514. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/manifest.yaml +0 -0
  515. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/recommended_kinds.yaml +0 -0
  516. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/severity_rules.yaml +0 -0
  517. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_authn_webauthn/coverage_matrix.md +0 -0
  518. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_authn_webauthn/elicit_extend.md +0 -0
  519. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_authn_webauthn/lexicon.yaml +0 -0
  520. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_authn_webauthn/manifest.yaml +0 -0
  521. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_authn_webauthn/recommended_kinds.yaml +0 -0
  522. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_authn_webauthn/severity_rules.yaml +0 -0
  523. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_browser_compat/coverage_matrix.md +0 -0
  524. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_browser_compat/elicit_extend.md +0 -0
  525. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_browser_compat/lexicon.yaml +0 -0
  526. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_browser_compat/manifest.yaml +0 -0
  527. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_browser_compat/recommended_kinds.yaml +0 -0
  528. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_browser_compat/severity_rules.yaml +0 -0
  529. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_forms_html5/coverage_matrix.md +0 -0
  530. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_forms_html5/elicit_extend.md +0 -0
  531. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_forms_html5/lexicon.yaml +0 -0
  532. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_forms_html5/manifest.yaml +0 -0
  533. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_forms_html5/recommended_kinds.yaml +0 -0
  534. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_forms_html5/severity_rules.yaml +0 -0
  535. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_performance_core_web_vitals/coverage_matrix.md +0 -0
  536. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_performance_core_web_vitals/elicit_extend.md +0 -0
  537. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_performance_core_web_vitals/lexicon.yaml +0 -0
  538. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_performance_core_web_vitals/manifest.yaml +0 -0
  539. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_performance_core_web_vitals/recommended_kinds.yaml +0 -0
  540. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_performance_core_web_vitals/severity_rules.yaml +0 -0
  541. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_pwa_manifest/coverage_matrix.md +0 -0
  542. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_pwa_manifest/elicit_extend.md +0 -0
  543. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_pwa_manifest/lexicon.yaml +0 -0
  544. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_pwa_manifest/manifest.yaml +0 -0
  545. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_pwa_manifest/recommended_kinds.yaml +0 -0
  546. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_pwa_manifest/severity_rules.yaml +0 -0
  547. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_responsive/coverage_matrix.md +0 -0
  548. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_responsive/elicit_extend.md +0 -0
  549. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_responsive/lexicon.yaml +0 -0
  550. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_responsive/manifest.yaml +0 -0
  551. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_responsive/recommended_kinds.yaml +0 -0
  552. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_responsive/severity_rules.yaml +0 -0
  553. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_security_owasp/coverage_matrix.md +0 -0
  554. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_security_owasp/elicit_extend.md +0 -0
  555. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_security_owasp/lexicon.yaml +0 -0
  556. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_security_owasp/manifest.yaml +0 -0
  557. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_security_owasp/recommended_kinds.yaml +0 -0
  558. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_security_owasp/severity_rules.yaml +0 -0
  559. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_seo_schemaorg/coverage_matrix.md +0 -0
  560. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_seo_schemaorg/elicit_extend.md +0 -0
  561. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_seo_schemaorg/lexicon.yaml +0 -0
  562. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_seo_schemaorg/manifest.yaml +0 -0
  563. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_seo_schemaorg/recommended_kinds.yaml +0 -0
  564. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_seo_schemaorg/severity_rules.yaml +0 -0
  565. {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/stack_map.yaml +0 -0
  566. {codd_dev-2.47.0 → codd_dev-2.48.0}/docs/cookbook/cdp_browser/README.md +0 -0
  567. {codd_dev-2.47.0 → codd_dev-2.48.0}/docs/cookbook/presentation_aggregation/README.md +0 -0
  568. {codd_dev-2.47.0 → codd_dev-2.48.0}/docs/requirements/README.md +0 -0
  569. {codd_dev-2.47.0 → codd_dev-2.48.0}/dogfood/README.md +0 -0
  570. {codd_dev-2.47.0 → codd_dev-2.48.0}/dogfood/fixtures/flat_py_app/README.md +0 -0
  571. {codd_dev-2.47.0 → codd_dev-2.48.0}/examples/README.md +0 -0
  572. {codd_dev-2.47.0 → codd_dev-2.48.0}/skills/codd-assemble/SKILL.md +0 -0
  573. {codd_dev-2.47.0 → codd_dev-2.48.0}/skills/codd-evolve/SKILL.md +0 -0
  574. {codd_dev-2.47.0 → codd_dev-2.48.0}/skills/codd-generate/SKILL.md +0 -0
  575. {codd_dev-2.47.0 → codd_dev-2.48.0}/skills/codd-greenfield/SKILL.md +0 -0
  576. {codd_dev-2.47.0 → codd_dev-2.48.0}/skills/codd-impact/SKILL.md +0 -0
  577. {codd_dev-2.47.0 → codd_dev-2.48.0}/skills/codd-init/SKILL.md +0 -0
  578. {codd_dev-2.47.0 → codd_dev-2.48.0}/skills/codd-propagate/SKILL.md +0 -0
  579. {codd_dev-2.47.0 → codd_dev-2.48.0}/skills/codd-restore/SKILL.md +0 -0
  580. {codd_dev-2.47.0 → codd_dev-2.48.0}/skills/codd-scan/SKILL.md +0 -0
  581. {codd_dev-2.47.0 → codd_dev-2.48.0}/skills/codd-validate/SKILL.md +0 -0
  582. {codd_dev-2.47.0 → codd_dev-2.48.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.47.0
3
+ Version: 2.48.0
4
4
  Summary: CoDD: Coherence-Driven Development — cross-artifact change impact analysis
5
5
  Project-URL: Homepage, https://github.com/yohey-w/codd-dev
6
6
  Project-URL: Repository, https://github.com/yohey-w/codd-dev
@@ -1,3 +1,3 @@
1
1
  """CoDD — Coherence-Driven Development."""
2
2
 
3
- __version__ = "2.47.0"
3
+ __version__ = "2.48.0"
@@ -0,0 +1,291 @@
1
+ """Deterministic web/HTTP end-to-end harness selection (language-aware).
2
+
3
+ Historically CoDD's generation pipeline selected a browser E2E harness
4
+ (Playwright/TypeScript ``*.spec.ts``) for ANY project whose capability profile
5
+ declared ``e2e_modality == "browser"`` — regardless of the project's host
6
+ language. A Python Flask web app with an HTTP surface and no node toolchain
7
+ therefore honest-failed at verify time with ``Cannot find module
8
+ '@playwright/test'``: CoDD chose a TS/node verification harness it had no way to
9
+ run. The CLI branch was already language-native ("invoke the built CLI as a
10
+ subprocess; do NOT use Playwright"); the web branch was not.
11
+
12
+ This module is the single, DETERMINISTIC decision point that makes web/HTTP E2E
13
+ harness selection language-aware, mirroring the CLI branch. The rules below are
14
+ pure functions of ``project_language`` + ``capabilities`` (+ explicit
15
+ ``constraints``); they NEVER infer intent from LLM prose.
16
+
17
+ Anti-false-green contract (the load-bearing rule). The Python HTTP downgrade for
18
+ a ``browser``-modality project is gated on POSITIVE, structured evidence that
19
+ HTTP-contract testing SUFFICES — never on the ABSENCE of a browser flag. An
20
+ earlier revision downgraded any Python browser-modality project that lacked an
21
+ explicit browser flag to ``pytest_http``; that was itself a false-GREEN, because
22
+ a Python web app whose UI/DOM/JS need was expressed only in design PROSE (and not
23
+ mirrored into structured constraints) silently got an HTTP-only harness and real
24
+ browser evidence was NEVER captured. The browser branch now classifies the
25
+ project three ways (:func:`_http_sufficiency`): an explicit browser flag/selector
26
+ or a ``user_interface`` capability → the real browser harness; a POSITIVE
27
+ http-sufficiency opt-in → ``pytest_http`` for Python; and ``unknown`` (no positive
28
+ signal either way) FAILS CLOSED to the browser harness. The worst case for an
29
+ ambiguous browser project is therefore a false-RED / explicit node-toolchain
30
+ requirement (an honest fail), NEVER a silent false-GREEN.
31
+
32
+ The matrix is generic (host-language × modality), not Python+Playwright
33
+ special-cased: TypeScript/node browser projects keep the existing Playwright
34
+ path BYTE-FOR-BYTE; a non-Python HTTP surface keeps today's behavior.
35
+ """
36
+
37
+ from __future__ import annotations
38
+
39
+ from collections.abc import Mapping
40
+ from dataclasses import dataclass
41
+ from typing import Any, Literal
42
+
43
+ from codd.project_types import ProjectCapabilities
44
+
45
+
46
+ __all__ = ["E2EHarnessSpec", "resolve_e2e_harness"]
47
+
48
+
49
+ #: Config/constraint keys whose VALUE explicitly selects a node/Playwright
50
+ #: browser-automation harness. Matching is exact (lower-cased) — prose is never
51
+ #: parsed. Keeping this a small allow-list (rather than a substring scan) is what
52
+ #: keeps the resolver deterministic and free of LLM-inference.
53
+ _EXPLICIT_BROWSER_HARNESS_VALUES = frozenset(
54
+ {"playwright", "playwright_node", "cypress", "browser", "node"}
55
+ )
56
+
57
+ #: Constraint keys that, when truthy, declare browser automation is required.
58
+ _EXPLICIT_BROWSER_FLAG_KEYS = frozenset(
59
+ {"browser_automation_required", "requires_browser", "browser_required"}
60
+ )
61
+
62
+ #: Constraint keys whose value is read as an explicit harness selector.
63
+ _E2E_HARNESS_SELECTOR_KEYS = frozenset({"e2e_harness", "e2e_runner", "harness"})
64
+
65
+ #: Constraint keys that, when truthy, are a POSITIVE, structured declaration that
66
+ #: HTTP-contract E2E testing is SUFFICIENT for this browser-modality project
67
+ #: (i.e. no real-browser/DOM evidence is required — a headless API surface that
68
+ #: happens to share the ``browser`` profile). This is the ONLY positive signal
69
+ #: that authorises the language-native ``pytest_http`` downgrade for a Python
70
+ #: browser-modality project. Matching is exact (lower-cased); prose is NEVER
71
+ #: parsed. Absence of this key is NOT a downgrade signal — see
72
+ #: :func:`_http_sufficiency` (``unknown`` fails CLOSED toward the browser harness).
73
+ _EXPLICIT_HTTP_SUFFICIENCY_FLAG_KEYS = frozenset(
74
+ {"http_contract_sufficient", "http_e2e_sufficient", "no_browser_required"}
75
+ )
76
+
77
+ #: Harness-selector VALUES that explicitly select the Python HTTP-contract
78
+ #: harness (the positive mirror of ``_EXPLICIT_BROWSER_HARNESS_VALUES``). An
79
+ #: owner who writes ``e2e_harness: pytest_http`` is positively declaring HTTP
80
+ #: suffices, just as ``e2e_harness: playwright`` positively declares the browser.
81
+ _EXPLICIT_HTTP_HARNESS_VALUES = frozenset({"pytest_http", "http", "pytest"})
82
+
83
+
84
+ @dataclass(frozen=True)
85
+ class E2EHarnessSpec:
86
+ """The resolved web/HTTP E2E harness for a project.
87
+
88
+ ``runner`` — logical runner id (``pytest_http`` | ``playwright`` |
89
+ ``native_cli`` | ``none``).
90
+ ``language`` — host language the generated tests are written in.
91
+ ``output_ext``— file extension for generated E2E test files (``.py`` | ``.ts``).
92
+ ``template_ref`` — the verification template the extractor/verify layer
93
+ routes this harness to (``pytest_http`` | ``playwright`` |
94
+ ``native_cli`` | ``none``).
95
+ ``requires_node_manifest`` — True when the harness needs a node manifest
96
+ (``package.json``) to run (Playwright). Consumed by the
97
+ conditional node-manifest scaffold (deferred) and the
98
+ toolchain-coherence gate; never inferred from prose.
99
+ """
100
+
101
+ runner: str
102
+ language: str
103
+ output_ext: str
104
+ template_ref: str
105
+ requires_node_manifest: bool = False
106
+
107
+
108
+ def _explicit_browser_required(constraints: Mapping[str, Any] | None) -> bool:
109
+ """True ONLY when constraints/config EXPLICITLY declare browser automation.
110
+
111
+ Deterministic: a truthy boolean flag key (e.g. ``browser_automation_required:
112
+ true``) OR a harness-selector key whose value names a browser/node runner
113
+ (e.g. ``e2e_harness: playwright_node``). Ambiguous/absent → False. This is the
114
+ ``browser_ui_required`` arm of :func:`_http_sufficiency`; absence is NOT a
115
+ downgrade signal (the ``unknown`` arm fails CLOSED to the browser harness, so a
116
+ missing flag never silently loses browser evidence). LLM prose is NEVER parsed.
117
+ """
118
+
119
+ if not isinstance(constraints, Mapping):
120
+ return False
121
+
122
+ for key, value in constraints.items():
123
+ if not isinstance(key, str):
124
+ continue
125
+ normalized_key = key.strip().lower()
126
+ if normalized_key in _EXPLICIT_BROWSER_FLAG_KEYS and bool(value):
127
+ return True
128
+ if normalized_key in _E2E_HARNESS_SELECTOR_KEYS and isinstance(value, str):
129
+ if value.strip().lower() in _EXPLICIT_BROWSER_HARNESS_VALUES:
130
+ return True
131
+ return False
132
+
133
+
134
+ def _explicit_http_sufficiency(constraints: Mapping[str, Any] | None) -> bool:
135
+ """True ONLY when constraints/config POSITIVELY declare HTTP E2E suffices.
136
+
137
+ Deterministic, structured-only mirror of :func:`_explicit_browser_required`:
138
+ a truthy boolean flag key (e.g. ``http_contract_sufficient: true``) OR a
139
+ harness-selector key whose value names the Python HTTP harness (e.g.
140
+ ``e2e_harness: pytest_http``). This is a POSITIVE opt-in — the owner is
141
+ explicitly stating no real-browser/DOM evidence is required. Ambiguous/absent
142
+ → False. LLM prose is NEVER parsed.
143
+ """
144
+
145
+ if not isinstance(constraints, Mapping):
146
+ return False
147
+
148
+ for key, value in constraints.items():
149
+ if not isinstance(key, str):
150
+ continue
151
+ normalized_key = key.strip().lower()
152
+ if normalized_key in _EXPLICIT_HTTP_SUFFICIENCY_FLAG_KEYS and bool(value):
153
+ return True
154
+ if normalized_key in _E2E_HARNESS_SELECTOR_KEYS and isinstance(value, str):
155
+ if value.strip().lower() in _EXPLICIT_HTTP_HARNESS_VALUES:
156
+ return True
157
+ return False
158
+
159
+
160
+ def _http_sufficiency(
161
+ constraints: Mapping[str, Any] | None,
162
+ capabilities: ProjectCapabilities,
163
+ ) -> Literal["browser_ui_required", "http_contract_sufficient", "unknown"]:
164
+ """Classify a BROWSER-modality project from POSITIVE, structured evidence only.
165
+
166
+ The decision is driven by POSITIVE evidence, never by the ABSENCE of a flag
167
+ (the historical false-GREEN: a Python web app whose UI/DOM need lived only in
168
+ design PROSE was silently downgraded to HTTP-only ``pytest_http``, so real
169
+ browser evidence was never captured). Three outcomes, in precedence order:
170
+
171
+ * ``browser_ui_required`` — an explicit browser flag/harness-selector
172
+ (:func:`_explicit_browser_required`), OR the structured capability signal
173
+ that a user interface is required (``capabilities.user_interface``). Routes
174
+ to the real browser harness (Playwright). The explicit flag has the highest
175
+ precedence: an owner who named a browser harness gets it unconditionally.
176
+ * ``http_contract_sufficient`` — a POSITIVE, structured opt-in declaring HTTP
177
+ E2E suffices (:func:`_explicit_http_sufficiency`): a constraint/config flag
178
+ or an ``e2e_harness: pytest_http`` selector. ONLY this positive signal
179
+ authorises the language-native HTTP downgrade for a Python project.
180
+ * ``unknown`` — NEITHER positive signal present. We do NOT silently downgrade;
181
+ the caller FAILS CLOSED toward the browser harness so browser evidence is
182
+ never lost (worst case a false-RED / explicit node-toolchain requirement,
183
+ NEVER a silent false-GREEN).
184
+
185
+ Reads ONLY structured/positive evidence (constraints + the capability
186
+ profile). Prose / LLM inference is never consulted.
187
+ """
188
+
189
+ # Explicit browser flag/selector wins outright (strongest explicit signal).
190
+ if _explicit_browser_required(constraints):
191
+ return "browser_ui_required"
192
+ # Positive HTTP-sufficiency opt-in is the ONLY authorised downgrade signal;
193
+ # it is checked before the UI-required capability so an owner can declare an
194
+ # HTTP-only contract for a profile that nominally carries ``user_interface``.
195
+ if _explicit_http_sufficiency(constraints):
196
+ return "http_contract_sufficient"
197
+ # A structured "UI is required" capability is positive browser-need evidence.
198
+ if capabilities.user_interface:
199
+ return "browser_ui_required"
200
+ # No positive signal either way → fail closed toward the browser harness.
201
+ return "unknown"
202
+
203
+
204
+ def resolve_e2e_harness(
205
+ *,
206
+ project_language: str | None,
207
+ capabilities: ProjectCapabilities,
208
+ constraints: Mapping[str, Any] | None = None,
209
+ ) -> E2EHarnessSpec:
210
+ """Deterministically resolve the E2E harness for a project.
211
+
212
+ Rules (pure function of inputs; no prose inference):
213
+
214
+ * ``e2e_modality == "cli"`` → native CLI harness (subprocess on the built
215
+ CLI). Output ext follows host language (``.py`` for Python, else ``.ts``).
216
+ The CLI branch already works end-to-end; this is here for completeness so
217
+ the resolver is the single decision point.
218
+ * ``e2e_modality == "browser"`` → a 3-way classification from POSITIVE,
219
+ structured evidence (:func:`_http_sufficiency`) — NEVER from the absence of
220
+ a flag (the historical false-GREEN that silently dropped browser evidence):
221
+ - ``http_contract_sufficient`` (a POSITIVE opt-in that HTTP suffices) AND
222
+ Python → ``pytest_http`` / ``.py``.
223
+ - ``browser_ui_required`` (explicit browser flag/selector, or the
224
+ ``user_interface`` capability) → ``playwright`` / ``.ts`` (node manifest).
225
+ - ``unknown`` (no positive signal) → FAIL CLOSED to ``playwright`` / ``.ts``
226
+ (node manifest). We never silently downgrade an unknown browser project
227
+ to ``pytest_http``: the worst case is a false-RED / explicit
228
+ node-toolchain requirement, NEVER a silent false-GREEN that loses real
229
+ browser/DOM evidence.
230
+ * non-browser HTTP surface (``network_surface == "http"``) → ``pytest_http``
231
+ / ``.py`` for Python; for any other language keep today's behavior by
232
+ routing to the Playwright/node path (``.ts``) so generality holds.
233
+ * otherwise → a ``none`` spec (no E2E layer applies).
234
+ """
235
+
236
+ lang = (project_language or "").strip().lower()
237
+ is_python = lang == "python"
238
+ modality = capabilities.e2e_modality
239
+
240
+ if modality == "cli":
241
+ return E2EHarnessSpec(
242
+ runner="native_cli",
243
+ language=lang or "python",
244
+ output_ext=".py" if is_python else ".ts",
245
+ template_ref="native_cli",
246
+ )
247
+
248
+ if modality == "browser":
249
+ classification = _http_sufficiency(constraints, capabilities)
250
+ # ONLY a POSITIVE http-sufficiency opt-in authorises the Python HTTP
251
+ # downgrade. ``browser_ui_required`` AND ``unknown`` both route to the
252
+ # real browser harness — ``unknown`` fails CLOSED so an undeclared
253
+ # browser project never silently loses DOM evidence (anti-false-green).
254
+ if is_python and classification == "http_contract_sufficient":
255
+ return E2EHarnessSpec(
256
+ runner="pytest_http",
257
+ language="python",
258
+ output_ext=".py",
259
+ template_ref="pytest_http",
260
+ )
261
+ return E2EHarnessSpec(
262
+ runner="playwright",
263
+ language="typescript",
264
+ output_ext=".ts",
265
+ template_ref="playwright",
266
+ requires_node_manifest=True,
267
+ )
268
+
269
+ if capabilities.network_surface == "http":
270
+ if is_python:
271
+ return E2EHarnessSpec(
272
+ runner="pytest_http",
273
+ language="python",
274
+ output_ext=".py",
275
+ template_ref="pytest_http",
276
+ )
277
+ # Non-Python HTTP surface: preserve today's TS/Playwright behavior.
278
+ return E2EHarnessSpec(
279
+ runner="playwright",
280
+ language=lang or "typescript",
281
+ output_ext=".ts",
282
+ template_ref="playwright",
283
+ requires_node_manifest=True,
284
+ )
285
+
286
+ return E2EHarnessSpec(
287
+ runner="none",
288
+ language=lang or "python",
289
+ output_ext=".py" if is_python else ".ts",
290
+ template_ref="none",
291
+ )
@@ -1993,6 +1993,114 @@ _ASSIGN_RE = re.compile(
1993
1993
  #: Derivation hops: ``a = f(param); b = g(a); expect(b…)`` resolves with 2 passes.
1994
1994
  _MAX_DERIVE_PASSES = 2
1995
1995
 
1996
+ #: An identifier token (TS/JS ``$``-bearing names and python names alike).
1997
+ _IDENT_RE = re.compile(r"[A-Za-z_$][\w$]*")
1998
+
1999
+
2000
+ def _rhs_reference_idents(rhs: str) -> set[str] | None:
2001
+ """Genuine variable REFERENCES on an assignment RHS — fails CLOSED.
2002
+
2003
+ The naive ``re.findall(IDENT, rhs)`` (pre-2.48) harvested every identifier
2004
+ on the RHS, INCLUDING those inside string literals, comments, and object
2005
+ KEYS — a false-GREEN: ``const body = "response"`` (string), ``const x =
2006
+ { response: 1 }`` (key), or ``const body = compute(); // response`` (comment)
2007
+ all wrongly marked the lhs param-derived, so a constant-only helper that
2008
+ merely *contains* that binding looked anchored to the call's data.
2009
+
2010
+ This is a small DETERMINISTIC char scanner (no LLM, no new deps). It returns
2011
+ only names that are genuine references:
2012
+
2013
+ * identifiers inside ``'…'`` / ``"…"`` / ``\\`…\\``` strings (backslash escapes
2014
+ honoured) and inside ``// line`` / ``/* block */`` comments are EXCLUDED;
2015
+ * an object-literal KEY (``{ key: … }`` — an identifier immediately followed
2016
+ by ``:`` while inside ``{…}``) is NOT a reference (its VALUE still is);
2017
+ * a PROPERTY name after a ``.`` member access (``foo.response``) is NOT an
2018
+ independent reference (the base ``foo`` still is).
2019
+
2020
+ Returns ``None`` when the RHS cannot be confidently scanned (an unterminated
2021
+ string or block comment) — the caller then declines to add the lhs to the
2022
+ derived set (FAIL-CLOSED ⇒ toward false-RED, never false-GREEN).
2023
+ """
2024
+
2025
+ refs: set[str] = set()
2026
+ i = 0
2027
+ n = len(rhs)
2028
+ # Brace-depth of OBJECT LITERALS in this RHS expression: in expression
2029
+ # position ``{`` opens an object literal, so an ``ident :`` at depth > 0 is a
2030
+ # key. Tracking depth keeps a top-level ternary ``cond ? a : b`` (depth 0)
2031
+ # from having its branches mis-read as keys (which would only ever fail
2032
+ # closed, but needlessly).
2033
+ brace_depth = 0
2034
+ while i < n:
2035
+ ch = rhs[i]
2036
+ # ── string literals: skip to the matching unescaped quote ──
2037
+ if ch == "'" or ch == '"' or ch == "`":
2038
+ quote = ch
2039
+ i += 1
2040
+ closed = False
2041
+ while i < n:
2042
+ c = rhs[i]
2043
+ if c == "\\": # escape — skip the next char
2044
+ i += 2
2045
+ continue
2046
+ if c == quote:
2047
+ i += 1
2048
+ closed = True
2049
+ break
2050
+ i += 1
2051
+ if not closed:
2052
+ return None # unterminated string → cannot scan → fail closed
2053
+ continue
2054
+ # ── comments: ``// …`` to EOL, ``/* … */`` block ──
2055
+ if ch == "/" and i + 1 < n and rhs[i + 1] == "/":
2056
+ while i < n and rhs[i] != "\n":
2057
+ i += 1
2058
+ continue
2059
+ if ch == "/" and i + 1 < n and rhs[i + 1] == "*":
2060
+ end = rhs.find("*/", i + 2)
2061
+ if end == -1:
2062
+ return None # unterminated block comment → fail closed
2063
+ i = end + 2
2064
+ continue
2065
+ # ── object-literal brace tracking ──
2066
+ if ch == "{":
2067
+ brace_depth += 1
2068
+ i += 1
2069
+ continue
2070
+ if ch == "}":
2071
+ if brace_depth > 0:
2072
+ brace_depth -= 1
2073
+ i += 1
2074
+ continue
2075
+ # ── identifier ──
2076
+ if ch.isalpha() or ch == "_" or ch == "$":
2077
+ m = _IDENT_RE.match(rhs, i)
2078
+ assert m is not None # ch starts a valid identifier
2079
+ name = m.group(0)
2080
+ start, j = m.start(), m.end()
2081
+ # PROPERTY after a ``.`` member access? walk back over whitespace.
2082
+ k = start - 1
2083
+ while k >= 0 and rhs[k] in " \t":
2084
+ k -= 1
2085
+ is_property = k >= 0 and rhs[k] == "."
2086
+ # OBJECT-LITERAL KEY? immediately followed by ``:`` while inside a
2087
+ # ``{…}`` (and not ``::``, which is not a key separator).
2088
+ p = j
2089
+ while p < n and rhs[p] in " \t":
2090
+ p += 1
2091
+ is_key = (
2092
+ brace_depth > 0
2093
+ and p < n
2094
+ and rhs[p] == ":"
2095
+ and not (p + 1 < n and rhs[p + 1] == ":")
2096
+ )
2097
+ if not is_property and not is_key:
2098
+ refs.add(name)
2099
+ i = j
2100
+ continue
2101
+ i += 1
2102
+ return refs
2103
+
1996
2104
 
1997
2105
  def _params_and_derived_locals(body: str, param_set: set[str]) -> set[str]:
1998
2106
  """``param_set`` plus locals DERIVED from a parameter within ``body`` (≤2 hops).
@@ -2007,6 +2115,13 @@ def _params_and_derived_locals(body: str, param_set: set[str]) -> set[str]:
2007
2115
  Constants never enter the set (``const k = 5`` references no param), so a
2008
2116
  constant-only helper stays unanchored ⇒ FAIL. Destructured bindings
2009
2117
  (``const { error } = body``) add each bound name when the RHS is derived.
2118
+
2119
+ The RHS is scanned by :func:`_rhs_reference_idents`, which counts only
2120
+ genuine variable references: identifiers inside STRING LITERALS, COMMENTS, and
2121
+ object KEYS do NOT flow a param (``const body = "response"`` does not derive
2122
+ ``body`` from a ``response`` param). When an RHS cannot be confidently scanned
2123
+ (unterminated string/comment) the lhs is NOT added — FAIL-CLOSED, never
2124
+ crediting fake coverage.
2010
2125
  """
2011
2126
 
2012
2127
  if not param_set:
@@ -2015,11 +2130,13 @@ def _params_and_derived_locals(body: str, param_set: set[str]) -> set[str]:
2015
2130
  for _ in range(_MAX_DERIVE_PASSES):
2016
2131
  grew = False
2017
2132
  for match in _ASSIGN_RE.finditer(body):
2018
- rhs_idents = set(re.findall(r"[A-Za-z_$][\w$]*", match.group("rhs")))
2133
+ rhs_idents = _rhs_reference_idents(match.group("rhs"))
2134
+ if rhs_idents is None:
2135
+ continue # RHS not confidently scannable → fail closed
2019
2136
  if not (rhs_idents & derived):
2020
2137
  continue
2021
2138
  lhs = match.group("destructure") or match.group("name") or ""
2022
- for lhs_name in re.findall(r"[A-Za-z_$][\w$]*", lhs):
2139
+ for lhs_name in _IDENT_RE.findall(lhs):
2023
2140
  if lhs_name not in derived:
2024
2141
  derived.add(lhs_name)
2025
2142
  grew = True
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "codd-dev"
7
- version = "2.47.0"
7
+ version = "2.48.0"
8
8
  description = "CoDD: Coherence-Driven Development — cross-artifact change impact analysis"
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -1,177 +0,0 @@
1
- """Deterministic web/HTTP end-to-end harness selection (language-aware).
2
-
3
- Historically CoDD's generation pipeline selected a browser E2E harness
4
- (Playwright/TypeScript ``*.spec.ts``) for ANY project whose capability profile
5
- declared ``e2e_modality == "browser"`` — regardless of the project's host
6
- language. A Python Flask web app with an HTTP surface and no node toolchain
7
- therefore honest-failed at verify time with ``Cannot find module
8
- '@playwright/test'``: CoDD chose a TS/node verification harness it had no way to
9
- run. The CLI branch was already language-native ("invoke the built CLI as a
10
- subprocess; do NOT use Playwright"); the web branch was not.
11
-
12
- This module is the single, DETERMINISTIC decision point that makes web/HTTP E2E
13
- harness selection language-aware, mirroring the CLI branch. The rules below are
14
- pure functions of ``project_language`` + ``capabilities`` (+ explicit
15
- ``constraints``); they NEVER infer intent from LLM prose. The North-Star
16
- contract is anti-false-green-safe: when browser automation is NOT explicitly
17
- required, a Python project gets a Python ``pytest`` HTTP E2E harness instead of
18
- TS Playwright. The worst case of preferring HTTP E2E for an ambiguous project is
19
- a false-RED / coverage gap (an honest fail), never a false-GREEN.
20
-
21
- The matrix is generic (host-language × modality), not Python+Playwright
22
- special-cased: TypeScript/node browser projects keep the existing Playwright
23
- path BYTE-FOR-BYTE; a non-Python HTTP surface keeps today's behavior.
24
- """
25
-
26
- from __future__ import annotations
27
-
28
- from collections.abc import Mapping
29
- from dataclasses import dataclass
30
- from typing import Any
31
-
32
- from codd.project_types import ProjectCapabilities
33
-
34
-
35
- __all__ = ["E2EHarnessSpec", "resolve_e2e_harness"]
36
-
37
-
38
- #: Config/constraint keys whose VALUE explicitly selects a node/Playwright
39
- #: browser-automation harness. Matching is exact (lower-cased) — prose is never
40
- #: parsed. Keeping this a small allow-list (rather than a substring scan) is what
41
- #: keeps the resolver deterministic and free of LLM-inference.
42
- _EXPLICIT_BROWSER_HARNESS_VALUES = frozenset(
43
- {"playwright", "playwright_node", "cypress", "browser", "node"}
44
- )
45
-
46
- #: Constraint keys that, when truthy, declare browser automation is required.
47
- _EXPLICIT_BROWSER_FLAG_KEYS = frozenset(
48
- {"browser_automation_required", "requires_browser", "browser_required"}
49
- )
50
-
51
- #: Constraint keys whose value is read as an explicit harness selector.
52
- _E2E_HARNESS_SELECTOR_KEYS = frozenset({"e2e_harness", "e2e_runner", "harness"})
53
-
54
-
55
- @dataclass(frozen=True)
56
- class E2EHarnessSpec:
57
- """The resolved web/HTTP E2E harness for a project.
58
-
59
- ``runner`` — logical runner id (``pytest_http`` | ``playwright`` |
60
- ``native_cli`` | ``none``).
61
- ``language`` — host language the generated tests are written in.
62
- ``output_ext``— file extension for generated E2E test files (``.py`` | ``.ts``).
63
- ``template_ref`` — the verification template the extractor/verify layer
64
- routes this harness to (``pytest_http`` | ``playwright`` |
65
- ``native_cli`` | ``none``).
66
- ``requires_node_manifest`` — True when the harness needs a node manifest
67
- (``package.json``) to run (Playwright). Consumed by the
68
- conditional node-manifest scaffold (deferred) and the
69
- toolchain-coherence gate; never inferred from prose.
70
- """
71
-
72
- runner: str
73
- language: str
74
- output_ext: str
75
- template_ref: str
76
- requires_node_manifest: bool = False
77
-
78
-
79
- def _explicit_browser_required(constraints: Mapping[str, Any] | None) -> bool:
80
- """True ONLY when constraints/config EXPLICITLY declare browser automation.
81
-
82
- Deterministic: a truthy boolean flag key (e.g. ``browser_automation_required:
83
- true``) OR a harness-selector key whose value names a browser/node runner
84
- (e.g. ``e2e_harness: playwright_node``). Ambiguous/absent → False, which
85
- routes Python projects to ``pytest_http`` (at worst a false-RED / coverage
86
- gap, never a false-GREEN). LLM prose is NEVER parsed.
87
- """
88
-
89
- if not isinstance(constraints, Mapping):
90
- return False
91
-
92
- for key, value in constraints.items():
93
- if not isinstance(key, str):
94
- continue
95
- normalized_key = key.strip().lower()
96
- if normalized_key in _EXPLICIT_BROWSER_FLAG_KEYS and bool(value):
97
- return True
98
- if normalized_key in _E2E_HARNESS_SELECTOR_KEYS and isinstance(value, str):
99
- if value.strip().lower() in _EXPLICIT_BROWSER_HARNESS_VALUES:
100
- return True
101
- return False
102
-
103
-
104
- def resolve_e2e_harness(
105
- *,
106
- project_language: str | None,
107
- capabilities: ProjectCapabilities,
108
- constraints: Mapping[str, Any] | None = None,
109
- ) -> E2EHarnessSpec:
110
- """Deterministically resolve the E2E harness for a project.
111
-
112
- Rules (pure function of inputs; no prose inference):
113
-
114
- * ``e2e_modality == "cli"`` → native CLI harness (subprocess on the built
115
- CLI). Output ext follows host language (``.py`` for Python, else ``.ts``).
116
- The CLI branch already works end-to-end; this is here for completeness so
117
- the resolver is the single decision point.
118
- * ``e2e_modality == "browser"``:
119
- - Python AND NOT explicit-browser-required → ``pytest_http`` / ``.py``.
120
- - else → ``playwright`` / ``.ts`` (requires a node manifest).
121
- * non-browser HTTP surface (``network_surface == "http"``) → ``pytest_http``
122
- / ``.py`` for Python; for any other language keep today's behavior by
123
- routing to the Playwright/node path (``.ts``) so generality holds.
124
- * otherwise → a ``none`` spec (no E2E layer applies).
125
- """
126
-
127
- lang = (project_language or "").strip().lower()
128
- is_python = lang == "python"
129
- modality = capabilities.e2e_modality
130
-
131
- if modality == "cli":
132
- return E2EHarnessSpec(
133
- runner="native_cli",
134
- language=lang or "python",
135
- output_ext=".py" if is_python else ".ts",
136
- template_ref="native_cli",
137
- )
138
-
139
- if modality == "browser":
140
- if is_python and not _explicit_browser_required(constraints):
141
- return E2EHarnessSpec(
142
- runner="pytest_http",
143
- language="python",
144
- output_ext=".py",
145
- template_ref="pytest_http",
146
- )
147
- return E2EHarnessSpec(
148
- runner="playwright",
149
- language="typescript",
150
- output_ext=".ts",
151
- template_ref="playwright",
152
- requires_node_manifest=True,
153
- )
154
-
155
- if capabilities.network_surface == "http":
156
- if is_python:
157
- return E2EHarnessSpec(
158
- runner="pytest_http",
159
- language="python",
160
- output_ext=".py",
161
- template_ref="pytest_http",
162
- )
163
- # Non-Python HTTP surface: preserve today's TS/Playwright behavior.
164
- return E2EHarnessSpec(
165
- runner="playwright",
166
- language=lang or "typescript",
167
- output_ext=".ts",
168
- template_ref="playwright",
169
- requires_node_manifest=True,
170
- )
171
-
172
- return E2EHarnessSpec(
173
- runner="none",
174
- language=lang or "python",
175
- output_ext=".py" if is_python else ".ts",
176
- template_ref="none",
177
- )
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