codd-dev 2.44.0__tar.gz → 2.46.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 (581) hide show
  1. {codd_dev-2.44.0 → codd_dev-2.46.0}/PKG-INFO +1 -1
  2. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/__init__.py +1 -1
  3. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/deployment/defaults/verification_templates.yaml +2 -0
  4. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/deployment/extractor.py +21 -4
  5. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/deployment/providers/verification/__init__.py +2 -0
  6. codd_dev-2.46.0/codd/deployment/providers/verification/pytest_http.py +197 -0
  7. codd_dev-2.46.0/codd/e2e_harness.py +177 -0
  8. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/generator.py +129 -5
  9. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/vb_marker_authenticity.py +56 -20
  10. {codd_dev-2.44.0 → codd_dev-2.46.0}/pyproject.toml +1 -1
  11. {codd_dev-2.44.0 → codd_dev-2.46.0}/.gitignore +0 -0
  12. {codd_dev-2.44.0 → codd_dev-2.46.0}/LICENSE +0 -0
  13. {codd_dev-2.44.0 → codd_dev-2.46.0}/README.md +0 -0
  14. {codd_dev-2.44.0 → codd_dev-2.46.0}/bench_fixture/README.md +0 -0
  15. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/__main__.py +0 -0
  16. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/_git_helper.py +0 -0
  17. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/action_outcome.py +0 -0
  18. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/ai_invoke.py +0 -0
  19. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/ai_patch.py +0 -0
  20. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/artifact_contract.py +0 -0
  21. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/artifact_ids.py +0 -0
  22. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/artifacts/catalog.yaml +0 -0
  23. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/ask_user_question_adapter.py +0 -0
  24. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/assembler.py +0 -0
  25. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/bridge.py +0 -0
  26. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/brownfield/__init__.py +0 -0
  27. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/brownfield/pipeline.py +0 -0
  28. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/capability_completeness.py +0 -0
  29. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/claude_cli.py +0 -0
  30. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/cli.py +0 -0
  31. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/clustering.py +0 -0
  32. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/coherence_adapters.py +0 -0
  33. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/coherence_engine.py +0 -0
  34. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/confidence.py +0 -0
  35. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/config.py +0 -0
  36. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/config_schema.py +0 -0
  37. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/contracts.py +0 -0
  38. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/contracts_registry/__init__.py +0 -0
  39. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/contracts_registry/__main__.py +0 -0
  40. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/contracts_registry/certify.py +0 -0
  41. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/contracts_registry/generate_matrix.py +0 -0
  42. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/contracts_registry/registry.py +0 -0
  43. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/coverage_auditor.py +0 -0
  44. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/coverage_execution_coherence.py +0 -0
  45. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/coverage_metrics.py +0 -0
  46. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/dag/__init__.py +0 -0
  47. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/dag/auto_repair.py +0 -0
  48. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/dag/builder.py +0 -0
  49. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/dag/checks/__init__.py +0 -0
  50. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/dag/checks/_one_to_many_detection.py +0 -0
  51. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/dag/checks/artifact_contract_check.py +0 -0
  52. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/dag/checks/ci_health.py +0 -0
  53. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/dag/checks/dependency_freshness.py +0 -0
  54. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/dag/checks/depends_on_consistency.py +0 -0
  55. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/dag/checks/deployment_completeness.py +0 -0
  56. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/dag/checks/edge_validity.py +0 -0
  57. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/dag/checks/environment_coverage.py +0 -0
  58. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/dag/checks/implementation_coverage.py +0 -0
  59. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/dag/checks/node_completeness.py +0 -0
  60. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/dag/checks/opt_out.py +0 -0
  61. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/dag/checks/task_completion.py +0 -0
  62. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/dag/checks/transitive_closure.py +0 -0
  63. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/dag/checks/ui_coherence.py +0 -0
  64. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/dag/checks/user_journey_coherence.py +0 -0
  65. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/dag/coverage_axes.py +0 -0
  66. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/dag/defaults/cli.yaml +0 -0
  67. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/dag/defaults/cpp_embedded.yaml +0 -0
  68. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/dag/defaults/csharp.yaml +0 -0
  69. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/dag/defaults/elixir.yaml +0 -0
  70. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/dag/defaults/generic.yaml +0 -0
  71. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/dag/defaults/iot.yaml +0 -0
  72. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/dag/defaults/java.yaml +0 -0
  73. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/dag/defaults/kotlin.yaml +0 -0
  74. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/dag/defaults/mobile.yaml +0 -0
  75. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/dag/defaults/ruby.yaml +0 -0
  76. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/dag/defaults/rust.yaml +0 -0
  77. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/dag/defaults/scala.yaml +0 -0
  78. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/dag/defaults/swift.yaml +0 -0
  79. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/dag/defaults/test_frameworks.yaml +0 -0
  80. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/dag/defaults/web.yaml +0 -0
  81. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/dag/extractor.py +0 -0
  82. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/dag/impact.py +0 -0
  83. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/dag/runner.py +0 -0
  84. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/defaults.py +0 -0
  85. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/defaults.yaml +0 -0
  86. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/dependency_lock_coherence.py +0 -0
  87. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/deploy_targets/__init__.py +0 -0
  88. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/deploy_targets/app_service.py +0 -0
  89. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/deploy_targets/base.py +0 -0
  90. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/deploy_targets/docker_compose.py +0 -0
  91. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/deployer.py +0 -0
  92. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/deployment/__init__.py +0 -0
  93. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/deployment/checks/__init__.py +0 -0
  94. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/deployment/defaults/deploy_targets.yaml +0 -0
  95. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/deployment/defaults/runtime_capability_inference.yaml +0 -0
  96. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/deployment/defaults/schema_providers.yaml +0 -0
  97. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/deployment/providers/__init__.py +0 -0
  98. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/deployment/providers/ai_command.py +0 -0
  99. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/deployment/providers/ai_command_factory.py +0 -0
  100. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/deployment/providers/codex_app_server.py +0 -0
  101. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/deployment/providers/llm_consideration.py +0 -0
  102. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/deployment/providers/schema/__init__.py +0 -0
  103. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/deployment/providers/schema/prisma.py +0 -0
  104. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/deployment/providers/target/__init__.py +0 -0
  105. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/deployment/providers/target/docker_compose.py +0 -0
  106. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/deployment/providers/verification/assertion_handlers.py +0 -0
  107. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/deployment/providers/verification/cdp_browser.py +0 -0
  108. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/deployment/providers/verification/cdp_engines.py +0 -0
  109. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/deployment/providers/verification/cdp_launchers.py +0 -0
  110. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/deployment/providers/verification/cdp_wire.py +0 -0
  111. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/deployment/providers/verification/curl.py +0 -0
  112. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/deployment/providers/verification/form_strategies.py +0 -0
  113. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/deployment/providers/verification/means_catalog.py +0 -0
  114. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/deployment/providers/verification/playwright.py +0 -0
  115. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/deployment/providers/verification/vitest.py +0 -0
  116. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/design_md.py +0 -0
  117. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/diff/__init__.py +0 -0
  118. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/diff/apply.py +0 -0
  119. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/diff/engine.py +0 -0
  120. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/diff/persistence.py +0 -0
  121. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/diff/templates/diff_prompt.md +0 -0
  122. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/discovery.py +0 -0
  123. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/drift.py +0 -0
  124. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/e2e_contract_coherence.py +0 -0
  125. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/e2e_extractor.py +0 -0
  126. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/e2e_generator.py +0 -0
  127. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/e2e_runner.py +0 -0
  128. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/elicit/__init__.py +0 -0
  129. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/elicit/apply.py +0 -0
  130. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/elicit/engine.py +0 -0
  131. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/elicit/finding.py +0 -0
  132. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/elicit/formatters/__init__.py +0 -0
  133. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/elicit/formatters/base.py +0 -0
  134. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/elicit/formatters/interactive.py +0 -0
  135. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/elicit/formatters/json_fmt.py +0 -0
  136. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/elicit/formatters/md.py +0 -0
  137. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/elicit/lexicon_loader.py +0 -0
  138. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/elicit/persistence.py +0 -0
  139. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/elicit/templates/elicit_prompt_L0.md +0 -0
  140. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/env_refs.py +0 -0
  141. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/extract_ai.py +0 -0
  142. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/extract_paths.py +0 -0
  143. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/extractor.py +0 -0
  144. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/fix/__init__.py +0 -0
  145. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/fix/candidate_selector.py +0 -0
  146. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/fix/design_updater.py +0 -0
  147. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/fix/impl_propagation.py +0 -0
  148. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/fix/interactive_prompt.py +0 -0
  149. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/fix/phenomenon_fixer.py +0 -0
  150. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/fix/phenomenon_parser.py +0 -0
  151. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/fix/risk_classifier.py +0 -0
  152. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/fix/templates/clarification_question.txt +0 -0
  153. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/fix/templates/design_update.txt +0 -0
  154. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/fix/templates/impl_update.txt +0 -0
  155. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/fix/templates/phenomenon_parse.txt +0 -0
  156. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/fix/templates/risk_assessment.txt +0 -0
  157. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/fix/templates_loader.py +0 -0
  158. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/fixer.py +0 -0
  159. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/fixup_drift.py +0 -0
  160. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/fixup_drift_strategies/__init__.py +0 -0
  161. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/fixup_drift_strategies/design_token_drift.py +0 -0
  162. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/fixup_drift_strategies/lexicon_violation.py +0 -0
  163. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/fixup_drift_strategies/url_drift.py +0 -0
  164. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/frontmatter.py +0 -0
  165. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/git_evidence.py +0 -0
  166. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/graph.py +0 -0
  167. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/greenfield/__init__.py +0 -0
  168. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/greenfield/pipeline.py +0 -0
  169. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/hitl_session.py +0 -0
  170. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/hooks/__init__.py +0 -0
  171. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/hooks/pre-commit +0 -0
  172. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/hooks/recipes/claude_requirements_nudge.json +0 -0
  173. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/hooks/recipes/claude_settings_example.json +0 -0
  174. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/hooks/recipes/codex_hook.sh +0 -0
  175. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/hooks/recipes/git_post_commit.sh +0 -0
  176. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/hooks/recipes/git_pre_commit.sh +0 -0
  177. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/iac_nfr.py +0 -0
  178. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/implement_oracle.py +0 -0
  179. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/implement_oracle_scope.py +0 -0
  180. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/implementer/__init__.py +0 -0
  181. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/implementer/chunked_runner.py +0 -0
  182. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/implementer/typecheck_loop.py +0 -0
  183. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/implementer.py +0 -0
  184. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/import_coherence.py +0 -0
  185. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/inheritance.py +0 -0
  186. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/init/__init__.py +0 -0
  187. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/init/lexicon_suggest.py +0 -0
  188. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/init/llm_lexicon_suggester.py +0 -0
  189. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/init/stack_detector.py +0 -0
  190. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/knowledge_fetcher.py +0 -0
  191. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/lexicon.py +0 -0
  192. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/lexicon_cli/__init__.py +0 -0
  193. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/lexicon_cli/formatters/__init__.py +0 -0
  194. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/lexicon_cli/formatters/html.py +0 -0
  195. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/lexicon_cli/formatters/json_fmt.py +0 -0
  196. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/lexicon_cli/formatters/md.py +0 -0
  197. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/lexicon_cli/inspector.py +0 -0
  198. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/lexicon_cli/manager.py +0 -0
  199. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/lexicon_cli/reporter.py +0 -0
  200. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/lexicon_cli/threshold.py +0 -0
  201. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/llm/__init__.py +0 -0
  202. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/llm/approval.py +0 -0
  203. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/llm/best_practice_augmenter.py +0 -0
  204. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/llm/criteria_expander.py +0 -0
  205. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/llm/design_doc_extractor.py +0 -0
  206. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/llm/impl_step_deriver.py +0 -0
  207. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/llm/means_catalog_loader.py +0 -0
  208. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/llm/parser.py +0 -0
  209. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/llm/plan_deriver.py +0 -0
  210. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/llm/prompt_builder.py +0 -0
  211. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/llm/strategy_validator.py +0 -0
  212. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/llm/templates/best_practice_augment_meta.md +0 -0
  213. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/llm/templates/criteria_expand_meta.md +0 -0
  214. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/llm/templates/design_doc_extract_meta.md +0 -0
  215. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/llm/templates/impl_step_derive_meta.md +0 -0
  216. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/llm/templates/implementation_step_catalog.yaml +0 -0
  217. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/llm/templates/meta_instruction.md +0 -0
  218. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/llm/templates/plan_derive_meta.md +0 -0
  219. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/llm/templates/verification_means_catalog.yaml +0 -0
  220. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/mcp_server.py +0 -0
  221. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/measure.py +0 -0
  222. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/operational_e2e_audit.py +0 -0
  223. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/operations_derive.py +0 -0
  224. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/parsing/__init__.py +0 -0
  225. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/parsing/_shared.py +0 -0
  226. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/parsing/api_specs.py +0 -0
  227. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/parsing/filesystem_routes.py +0 -0
  228. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/parsing/iac.py +0 -0
  229. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/parsing/python_ast.py +0 -0
  230. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/parsing/schemas.py +0 -0
  231. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/parsing/tests_builddeps.py +0 -0
  232. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/parsing/treesitter.py +0 -0
  233. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/planner.py +0 -0
  234. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/policy.py +0 -0
  235. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/preflight/__init__.py +0 -0
  236. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/preflight/defaults/cli.yaml +0 -0
  237. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/preflight/defaults/generic.yaml +0 -0
  238. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/preflight/defaults/iot.yaml +0 -0
  239. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/preflight/defaults/mobile.yaml +0 -0
  240. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/preflight/defaults/web.yaml +0 -0
  241. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/project_types.py +0 -0
  242. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/propagate.py +0 -0
  243. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/propagation_common.py +0 -0
  244. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/propagator.py +0 -0
  245. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/reconciliation_ledger.py +0 -0
  246. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/reference_resolution.py +0 -0
  247. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/registry.py +0 -0
  248. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/repair/__init__.py +0 -0
  249. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/repair/approval_repair.py +0 -0
  250. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/repair/auto_scope_guard.py +0 -0
  251. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/repair/engine.py +0 -0
  252. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/repair/git_patcher.py +0 -0
  253. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/repair/history.py +0 -0
  254. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/repair/llm_repair_engine.py +0 -0
  255. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/repair/loop.py +0 -0
  256. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/repair/primary_picker.py +0 -0
  257. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/repair/proof_breaks.py +0 -0
  258. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/repair/repair_result.py +0 -0
  259. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/repair/repairability_classifier.py +0 -0
  260. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/repair/schema.py +0 -0
  261. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/repair/templates/analyze_meta.md +0 -0
  262. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/repair/templates/propose_meta.md +0 -0
  263. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/repair/templates/repair_strategy_meta.md +0 -0
  264. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/repair/templates/repairability_meta.md +0 -0
  265. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/repair/test_failure_attribution.py +0 -0
  266. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/repair/verify_runner.py +0 -0
  267. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/repair_slice.py +0 -0
  268. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/require.py +0 -0
  269. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/require_plugins.py +0 -0
  270. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/require_propagate.py +0 -0
  271. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/required_artifacts/defaults/cli.yaml +0 -0
  272. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/required_artifacts/defaults/generic.yaml +0 -0
  273. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/required_artifacts/defaults/iot.yaml +0 -0
  274. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/required_artifacts/defaults/mobile.yaml +0 -0
  275. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/required_artifacts/defaults/web.yaml +0 -0
  276. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/required_artifacts_deriver.py +0 -0
  277. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/requirement_completeness/defaults/cli.yaml +0 -0
  278. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/requirement_completeness/defaults/generic.yaml +0 -0
  279. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/requirement_completeness/defaults/iot.yaml +0 -0
  280. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/requirement_completeness/defaults/mobile.yaml +0 -0
  281. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/requirement_completeness/defaults/web.yaml +0 -0
  282. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/requirement_completeness_auditor.py +0 -0
  283. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/requirement_reconciliation.py +0 -0
  284. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/requirements_meta.py +0 -0
  285. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/restoration_report.py +0 -0
  286. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/restore.py +0 -0
  287. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/routes_extractor.py +0 -0
  288. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/runtime_smoke/__init__.py +0 -0
  289. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/runtime_smoke/checks.py +0 -0
  290. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/runtime_smoke/config.py +0 -0
  291. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/runtime_smoke/report.py +0 -0
  292. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/runtime_smoke/runner.py +0 -0
  293. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/scanner.py +0 -0
  294. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/schema_refs.py +0 -0
  295. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/screen_flow_validator.py +0 -0
  296. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/screen_transition_extractor.py +0 -0
  297. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/screen_transitions/defaults.yaml +0 -0
  298. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/skills_cli/__init__.py +0 -0
  299. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/skills_cli/discovery.py +0 -0
  300. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/skills_cli/manager.py +0 -0
  301. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/skills_cli/paths.py +0 -0
  302. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/surface_reconciliation.py +0 -0
  303. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/synth.py +0 -0
  304. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/templates/codd.yaml.tmpl +0 -0
  305. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/templates/conventions.yaml.tmpl +0 -0
  306. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/templates/data_dependencies.yaml.tmpl +0 -0
  307. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/templates/doc_links.yaml.tmpl +0 -0
  308. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/templates/extract_ai_prompt_baseline.md +0 -0
  309. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/templates/extracted/api-contract.md.j2 +0 -0
  310. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/templates/extracted/architecture-overview.md.j2 +0 -0
  311. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/templates/extracted/module-detail.md.j2 +0 -0
  312. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/templates/extracted/schema-design.md.j2 +0 -0
  313. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/templates/extracted/system-context.md.j2 +0 -0
  314. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/templates/gitignore.tmpl +0 -0
  315. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/templates/lexicon_questions.md +0 -0
  316. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/templates/lexicon_schema.yaml +0 -0
  317. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/templates/overrides.yaml.tmpl +0 -0
  318. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/test_detection.py +0 -0
  319. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/test_import_coherence.py +0 -0
  320. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/traceability.py +0 -0
  321. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/validator.py +0 -0
  322. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/vb_rerun_scope.py +0 -0
  323. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/verifiable_behavior_audit.py +0 -0
  324. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/watch/__init__.py +0 -0
  325. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/watch/events.py +0 -0
  326. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/watch/propagation_log.py +0 -0
  327. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/watch/propagation_pipeline.py +0 -0
  328. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/watch/test_runner.py +0 -0
  329. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/watch/watcher.py +0 -0
  330. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd/wiring.py +0 -0
  331. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/ai_governance_eu_act/coverage_matrix.md +0 -0
  332. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/ai_governance_eu_act/elicit_extend.md +0 -0
  333. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/ai_governance_eu_act/lexicon.yaml +0 -0
  334. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/ai_governance_eu_act/manifest.yaml +0 -0
  335. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/ai_governance_eu_act/recommended_kinds.yaml +0 -0
  336. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/ai_governance_eu_act/severity_rules.yaml +0 -0
  337. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/api_rate_limiting_caching/coverage_matrix.md +0 -0
  338. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/api_rate_limiting_caching/elicit_extend.md +0 -0
  339. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/api_rate_limiting_caching/lexicon.yaml +0 -0
  340. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/api_rate_limiting_caching/manifest.yaml +0 -0
  341. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/api_rate_limiting_caching/recommended_kinds.yaml +0 -0
  342. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/api_rate_limiting_caching/severity_rules.yaml +0 -0
  343. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/api_rest_openapi/coverage_matrix.md +0 -0
  344. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/api_rest_openapi/elicit_extend.md +0 -0
  345. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/api_rest_openapi/lexicon.yaml +0 -0
  346. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/api_rest_openapi/manifest.yaml +0 -0
  347. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/api_rest_openapi/recommended_kinds.yaml +0 -0
  348. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/api_rest_openapi/severity_rules.yaml +0 -0
  349. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/babok/elicit_extend.md +0 -0
  350. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/babok/lexicon.yaml +0 -0
  351. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/babok/manifest.yaml +0 -0
  352. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/babok/recommended_kinds.yaml +0 -0
  353. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/babok/severity_rules.yaml +0 -0
  354. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/backend_event_cloudevents/coverage_matrix.md +0 -0
  355. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/backend_event_cloudevents/elicit_extend.md +0 -0
  356. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/backend_event_cloudevents/lexicon.yaml +0 -0
  357. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/backend_event_cloudevents/manifest.yaml +0 -0
  358. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/backend_event_cloudevents/recommended_kinds.yaml +0 -0
  359. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/backend_event_cloudevents/severity_rules.yaml +0 -0
  360. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/backend_graphql/coverage_matrix.md +0 -0
  361. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/backend_graphql/elicit_extend.md +0 -0
  362. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/backend_graphql/lexicon.yaml +0 -0
  363. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/backend_graphql/manifest.yaml +0 -0
  364. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/backend_graphql/recommended_kinds.yaml +0 -0
  365. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/backend_graphql/severity_rules.yaml +0 -0
  366. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/backend_grpc_proto/coverage_matrix.md +0 -0
  367. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/backend_grpc_proto/elicit_extend.md +0 -0
  368. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/backend_grpc_proto/lexicon.yaml +0 -0
  369. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/backend_grpc_proto/manifest.yaml +0 -0
  370. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/backend_grpc_proto/recommended_kinds.yaml +0 -0
  371. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/backend_grpc_proto/severity_rules.yaml +0 -0
  372. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/compliance_hipaa/coverage_matrix.md +0 -0
  373. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/compliance_hipaa/elicit_extend.md +0 -0
  374. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/compliance_hipaa/lexicon.yaml +0 -0
  375. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/compliance_hipaa/manifest.yaml +0 -0
  376. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/compliance_hipaa/recommended_kinds.yaml +0 -0
  377. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/compliance_hipaa/severity_rules.yaml +0 -0
  378. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/compliance_iso27001/coverage_matrix.md +0 -0
  379. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/compliance_iso27001/elicit_extend.md +0 -0
  380. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/compliance_iso27001/lexicon.yaml +0 -0
  381. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/compliance_iso27001/manifest.yaml +0 -0
  382. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/compliance_iso27001/recommended_kinds.yaml +0 -0
  383. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/compliance_iso27001/severity_rules.yaml +0 -0
  384. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/compliance_pci_dss_4/coverage_matrix.md +0 -0
  385. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/compliance_pci_dss_4/elicit_extend.md +0 -0
  386. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/compliance_pci_dss_4/lexicon.yaml +0 -0
  387. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/compliance_pci_dss_4/manifest.yaml +0 -0
  388. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/compliance_pci_dss_4/recommended_kinds.yaml +0 -0
  389. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/compliance_pci_dss_4/severity_rules.yaml +0 -0
  390. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/data_aggregation_policies/coverage_matrix.md +0 -0
  391. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/data_aggregation_policies/elicit_extend.md +0 -0
  392. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/data_aggregation_policies/lexicon.yaml +0 -0
  393. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/data_aggregation_policies/manifest.yaml +0 -0
  394. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/data_aggregation_policies/recommended_kinds.yaml +0 -0
  395. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/data_aggregation_policies/severity_rules.yaml +0 -0
  396. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/coverage_matrix.md +0 -0
  397. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/elicit_extend.md +0 -0
  398. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/lexicon.yaml +0 -0
  399. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/manifest.yaml +0 -0
  400. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/recommended_kinds.yaml +0 -0
  401. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/severity_rules.yaml +0 -0
  402. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/data_governance_appi_gdpr/coverage_matrix.md +0 -0
  403. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/data_governance_appi_gdpr/elicit_extend.md +0 -0
  404. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/data_governance_appi_gdpr/lexicon.yaml +0 -0
  405. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/data_governance_appi_gdpr/manifest.yaml +0 -0
  406. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/data_governance_appi_gdpr/recommended_kinds.yaml +0 -0
  407. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/data_governance_appi_gdpr/severity_rules.yaml +0 -0
  408. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/data_nosql_jsonschema/coverage_matrix.md +0 -0
  409. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/data_nosql_jsonschema/elicit_extend.md +0 -0
  410. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/data_nosql_jsonschema/lexicon.yaml +0 -0
  411. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/data_nosql_jsonschema/manifest.yaml +0 -0
  412. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/data_nosql_jsonschema/recommended_kinds.yaml +0 -0
  413. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/data_nosql_jsonschema/severity_rules.yaml +0 -0
  414. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/data_relational_iso_sql/coverage_matrix.md +0 -0
  415. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/data_relational_iso_sql/elicit_extend.md +0 -0
  416. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/data_relational_iso_sql/lexicon.yaml +0 -0
  417. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/data_relational_iso_sql/manifest.yaml +0 -0
  418. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/data_relational_iso_sql/recommended_kinds.yaml +0 -0
  419. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/data_relational_iso_sql/severity_rules.yaml +0 -0
  420. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/ddd_domain_driven_design/coverage_matrix.md +0 -0
  421. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/ddd_domain_driven_design/elicit_extend.md +0 -0
  422. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/ddd_domain_driven_design/lexicon.yaml +0 -0
  423. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/ddd_domain_driven_design/manifest.yaml +0 -0
  424. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/ddd_domain_driven_design/recommended_kinds.yaml +0 -0
  425. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/ddd_domain_driven_design/severity_rules.yaml +0 -0
  426. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/dora_sre_metrics/coverage_matrix.md +0 -0
  427. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/dora_sre_metrics/elicit_extend.md +0 -0
  428. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/dora_sre_metrics/lexicon.yaml +0 -0
  429. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/dora_sre_metrics/manifest.yaml +0 -0
  430. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/dora_sre_metrics/recommended_kinds.yaml +0 -0
  431. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/dora_sre_metrics/severity_rules.yaml +0 -0
  432. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/i18n_unicode_cldr/coverage_matrix.md +0 -0
  433. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/i18n_unicode_cldr/elicit_extend.md +0 -0
  434. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/i18n_unicode_cldr/lexicon.yaml +0 -0
  435. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/i18n_unicode_cldr/manifest.yaml +0 -0
  436. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/i18n_unicode_cldr/recommended_kinds.yaml +0 -0
  437. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/i18n_unicode_cldr/severity_rules.yaml +0 -0
  438. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/ml_model_cards/coverage_matrix.md +0 -0
  439. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/ml_model_cards/elicit_extend.md +0 -0
  440. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/ml_model_cards/lexicon.yaml +0 -0
  441. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/ml_model_cards/manifest.yaml +0 -0
  442. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/ml_model_cards/recommended_kinds.yaml +0 -0
  443. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/ml_model_cards/severity_rules.yaml +0 -0
  444. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/mobile_a11y_native/coverage_matrix.md +0 -0
  445. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/mobile_a11y_native/elicit_extend.md +0 -0
  446. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/mobile_a11y_native/lexicon.yaml +0 -0
  447. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/mobile_a11y_native/manifest.yaml +0 -0
  448. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/mobile_a11y_native/recommended_kinds.yaml +0 -0
  449. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/mobile_a11y_native/severity_rules.yaml +0 -0
  450. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/mobile_android_material3/coverage_matrix.md +0 -0
  451. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/mobile_android_material3/elicit_extend.md +0 -0
  452. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/mobile_android_material3/lexicon.yaml +0 -0
  453. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/mobile_android_material3/manifest.yaml +0 -0
  454. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/mobile_android_material3/recommended_kinds.yaml +0 -0
  455. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/mobile_android_material3/severity_rules.yaml +0 -0
  456. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/mobile_ios_hig/coverage_matrix.md +0 -0
  457. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/mobile_ios_hig/elicit_extend.md +0 -0
  458. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/mobile_ios_hig/lexicon.yaml +0 -0
  459. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/mobile_ios_hig/manifest.yaml +0 -0
  460. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/mobile_ios_hig/recommended_kinds.yaml +0 -0
  461. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/mobile_ios_hig/severity_rules.yaml +0 -0
  462. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/mobile_security_masvs/coverage_matrix.md +0 -0
  463. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/mobile_security_masvs/elicit_extend.md +0 -0
  464. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/mobile_security_masvs/lexicon.yaml +0 -0
  465. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/mobile_security_masvs/manifest.yaml +0 -0
  466. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/mobile_security_masvs/recommended_kinds.yaml +0 -0
  467. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/mobile_security_masvs/severity_rules.yaml +0 -0
  468. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/ops_cicd_pipeline/coverage_matrix.md +0 -0
  469. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/ops_cicd_pipeline/elicit_extend.md +0 -0
  470. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/ops_cicd_pipeline/lexicon.yaml +0 -0
  471. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/ops_cicd_pipeline/manifest.yaml +0 -0
  472. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/ops_cicd_pipeline/recommended_kinds.yaml +0 -0
  473. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/ops_cicd_pipeline/severity_rules.yaml +0 -0
  474. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/ops_iac_terraform/coverage_matrix.md +0 -0
  475. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/ops_iac_terraform/elicit_extend.md +0 -0
  476. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/ops_iac_terraform/lexicon.yaml +0 -0
  477. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/ops_iac_terraform/manifest.yaml +0 -0
  478. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/ops_iac_terraform/recommended_kinds.yaml +0 -0
  479. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/ops_iac_terraform/severity_rules.yaml +0 -0
  480. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/ops_kubernetes/coverage_matrix.md +0 -0
  481. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/ops_kubernetes/elicit_extend.md +0 -0
  482. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/ops_kubernetes/lexicon.yaml +0 -0
  483. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/ops_kubernetes/manifest.yaml +0 -0
  484. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/ops_kubernetes/recommended_kinds.yaml +0 -0
  485. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/ops_kubernetes/severity_rules.yaml +0 -0
  486. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/ops_observability_otel/coverage_matrix.md +0 -0
  487. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/ops_observability_otel/elicit_extend.md +0 -0
  488. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/ops_observability_otel/lexicon.yaml +0 -0
  489. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/ops_observability_otel/manifest.yaml +0 -0
  490. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/ops_observability_otel/recommended_kinds.yaml +0 -0
  491. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/ops_observability_otel/severity_rules.yaml +0 -0
  492. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/process_iso25010/coverage_matrix.md +0 -0
  493. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/process_iso25010/elicit_extend.md +0 -0
  494. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/process_iso25010/lexicon.yaml +0 -0
  495. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/process_iso25010/manifest.yaml +0 -0
  496. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/process_iso25010/recommended_kinds.yaml +0 -0
  497. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/process_iso25010/severity_rules.yaml +0 -0
  498. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/process_test_iso29119/coverage_matrix.md +0 -0
  499. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/process_test_iso29119/elicit_extend.md +0 -0
  500. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/process_test_iso29119/lexicon.yaml +0 -0
  501. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/process_test_iso29119/manifest.yaml +0 -0
  502. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/process_test_iso29119/recommended_kinds.yaml +0 -0
  503. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/process_test_iso29119/severity_rules.yaml +0 -0
  504. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/twelve_factor_app/coverage_matrix.md +0 -0
  505. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/twelve_factor_app/elicit_extend.md +0 -0
  506. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/twelve_factor_app/lexicon.yaml +0 -0
  507. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/twelve_factor_app/manifest.yaml +0 -0
  508. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/twelve_factor_app/recommended_kinds.yaml +0 -0
  509. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/twelve_factor_app/severity_rules.yaml +0 -0
  510. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/coverage_matrix.md +0 -0
  511. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/elicit_extend.md +0 -0
  512. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/lexicon.yaml +0 -0
  513. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/manifest.yaml +0 -0
  514. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/recommended_kinds.yaml +0 -0
  515. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/severity_rules.yaml +0 -0
  516. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/web_authn_webauthn/coverage_matrix.md +0 -0
  517. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/web_authn_webauthn/elicit_extend.md +0 -0
  518. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/web_authn_webauthn/lexicon.yaml +0 -0
  519. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/web_authn_webauthn/manifest.yaml +0 -0
  520. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/web_authn_webauthn/recommended_kinds.yaml +0 -0
  521. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/web_authn_webauthn/severity_rules.yaml +0 -0
  522. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/web_browser_compat/coverage_matrix.md +0 -0
  523. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/web_browser_compat/elicit_extend.md +0 -0
  524. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/web_browser_compat/lexicon.yaml +0 -0
  525. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/web_browser_compat/manifest.yaml +0 -0
  526. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/web_browser_compat/recommended_kinds.yaml +0 -0
  527. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/web_browser_compat/severity_rules.yaml +0 -0
  528. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/web_forms_html5/coverage_matrix.md +0 -0
  529. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/web_forms_html5/elicit_extend.md +0 -0
  530. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/web_forms_html5/lexicon.yaml +0 -0
  531. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/web_forms_html5/manifest.yaml +0 -0
  532. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/web_forms_html5/recommended_kinds.yaml +0 -0
  533. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/web_forms_html5/severity_rules.yaml +0 -0
  534. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/web_performance_core_web_vitals/coverage_matrix.md +0 -0
  535. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/web_performance_core_web_vitals/elicit_extend.md +0 -0
  536. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/web_performance_core_web_vitals/lexicon.yaml +0 -0
  537. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/web_performance_core_web_vitals/manifest.yaml +0 -0
  538. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/web_performance_core_web_vitals/recommended_kinds.yaml +0 -0
  539. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/web_performance_core_web_vitals/severity_rules.yaml +0 -0
  540. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/web_pwa_manifest/coverage_matrix.md +0 -0
  541. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/web_pwa_manifest/elicit_extend.md +0 -0
  542. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/web_pwa_manifest/lexicon.yaml +0 -0
  543. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/web_pwa_manifest/manifest.yaml +0 -0
  544. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/web_pwa_manifest/recommended_kinds.yaml +0 -0
  545. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/web_pwa_manifest/severity_rules.yaml +0 -0
  546. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/web_responsive/coverage_matrix.md +0 -0
  547. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/web_responsive/elicit_extend.md +0 -0
  548. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/web_responsive/lexicon.yaml +0 -0
  549. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/web_responsive/manifest.yaml +0 -0
  550. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/web_responsive/recommended_kinds.yaml +0 -0
  551. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/web_responsive/severity_rules.yaml +0 -0
  552. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/web_security_owasp/coverage_matrix.md +0 -0
  553. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/web_security_owasp/elicit_extend.md +0 -0
  554. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/web_security_owasp/lexicon.yaml +0 -0
  555. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/web_security_owasp/manifest.yaml +0 -0
  556. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/web_security_owasp/recommended_kinds.yaml +0 -0
  557. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/web_security_owasp/severity_rules.yaml +0 -0
  558. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/web_seo_schemaorg/coverage_matrix.md +0 -0
  559. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/web_seo_schemaorg/elicit_extend.md +0 -0
  560. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/web_seo_schemaorg/lexicon.yaml +0 -0
  561. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/web_seo_schemaorg/manifest.yaml +0 -0
  562. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/web_seo_schemaorg/recommended_kinds.yaml +0 -0
  563. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/lexicons/web_seo_schemaorg/severity_rules.yaml +0 -0
  564. {codd_dev-2.44.0 → codd_dev-2.46.0}/codd_plugins/stack_map.yaml +0 -0
  565. {codd_dev-2.44.0 → codd_dev-2.46.0}/docs/cookbook/cdp_browser/README.md +0 -0
  566. {codd_dev-2.44.0 → codd_dev-2.46.0}/docs/cookbook/presentation_aggregation/README.md +0 -0
  567. {codd_dev-2.44.0 → codd_dev-2.46.0}/docs/requirements/README.md +0 -0
  568. {codd_dev-2.44.0 → codd_dev-2.46.0}/dogfood/README.md +0 -0
  569. {codd_dev-2.44.0 → codd_dev-2.46.0}/dogfood/fixtures/flat_py_app/README.md +0 -0
  570. {codd_dev-2.44.0 → codd_dev-2.46.0}/examples/README.md +0 -0
  571. {codd_dev-2.44.0 → codd_dev-2.46.0}/skills/codd-assemble/SKILL.md +0 -0
  572. {codd_dev-2.44.0 → codd_dev-2.46.0}/skills/codd-evolve/SKILL.md +0 -0
  573. {codd_dev-2.44.0 → codd_dev-2.46.0}/skills/codd-generate/SKILL.md +0 -0
  574. {codd_dev-2.44.0 → codd_dev-2.46.0}/skills/codd-greenfield/SKILL.md +0 -0
  575. {codd_dev-2.44.0 → codd_dev-2.46.0}/skills/codd-impact/SKILL.md +0 -0
  576. {codd_dev-2.44.0 → codd_dev-2.46.0}/skills/codd-init/SKILL.md +0 -0
  577. {codd_dev-2.44.0 → codd_dev-2.46.0}/skills/codd-propagate/SKILL.md +0 -0
  578. {codd_dev-2.44.0 → codd_dev-2.46.0}/skills/codd-restore/SKILL.md +0 -0
  579. {codd_dev-2.44.0 → codd_dev-2.46.0}/skills/codd-scan/SKILL.md +0 -0
  580. {codd_dev-2.44.0 → codd_dev-2.46.0}/skills/codd-validate/SKILL.md +0 -0
  581. {codd_dev-2.44.0 → codd_dev-2.46.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.44.0
3
+ Version: 2.46.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.44.0"
3
+ __version__ = "2.46.0"
@@ -5,3 +5,5 @@ templates:
5
5
  playwright:
6
6
  headless: true
7
7
  timeout: 60000
8
+ pytest_http:
9
+ timeout: 120000
@@ -40,11 +40,21 @@ SMOKE_TEST_PATTERNS = (
40
40
  )
41
41
  # All globs are kept: Playwright's convention is ``*.spec.ts``, a CLI
42
42
  # (vitest/jest) e2e is commonly ``*.test.ts``, and ``*.e2e.ts`` is the explicit
43
- # e2e naming convention codex emits unprompted. Routing to the right RUNNER
44
- # happens in :func:`_verification_template_ref` (by ``e2e_modality``); discovery
43
+ # e2e naming convention codex emits unprompted. The ``test_*.py``/``*_test.py``
44
+ # globs discover Python HTTP e2e tests (pytest convention) emitted by the
45
+ # language-aware web harness (:mod:`codd.e2e_harness`) for Python projects;
46
+ # bare ``tests/e2e/*.py`` is intentionally NOT a pattern (it would wrongly grab
47
+ # ``__init__.py`` / helper modules). Routing to the right RUNNER happens in
48
+ # :func:`_verification_template_ref` (by extension + ``e2e_modality``); discovery
45
49
  # must see every shape so a generated e2e test is not silently dropped (an
46
- # undiscovered ``.e2e.ts`` e2e means the verify stage never RUNS it).
47
- E2E_TEST_PATTERNS = ("tests/e2e/*.spec.ts", "tests/e2e/*.test.ts", "tests/e2e/*.e2e.ts")
50
+ # undiscovered e2e means the verify stage never RUNS it).
51
+ E2E_TEST_PATTERNS = (
52
+ "tests/e2e/*.spec.ts",
53
+ "tests/e2e/*.test.ts",
54
+ "tests/e2e/*.e2e.ts",
55
+ "tests/e2e/test_*.py",
56
+ "tests/e2e/*_test.py",
57
+ )
48
58
  RUNTIME_CAPABILITY_INFERENCE_DEFAULTS = Path(__file__).parent / "defaults" / "runtime_capability_inference.yaml"
49
59
 
50
60
  DEPLOYMENT_SECTION_IMPL_PATTERNS: dict[str, tuple[str, ...]] = {
@@ -934,6 +944,11 @@ def _verification_template_ref(
934
944
 
935
945
  ``device`` modality has no built-in runner template yet, so it also keeps
936
946
  the legacy ``playwright`` default rather than silently dropping the test.
947
+
948
+ A ``.py`` e2e file routes to ``pytest_http`` (Python HTTP e2e), the
949
+ language-native runner emitted by the language-aware web harness
950
+ (:mod:`codd.e2e_harness`). The TS/JS modality routing and ``.sh`` → ``curl``
951
+ behavior are unchanged (generality: node-targeting behavior must not move).
937
952
  """
938
953
  if cdp_browser_journey:
939
954
  return "cdp_browser"
@@ -942,6 +957,8 @@ def _verification_template_ref(
942
957
  if modality == "cli":
943
958
  return "vitest"
944
959
  return "playwright"
960
+ if path.suffix == ".py":
961
+ return "pytest_http"
945
962
  if path.suffix == ".sh":
946
963
  return "curl"
947
964
  return "document"
@@ -8,6 +8,7 @@ from . import cdp_wire as cdp_wire
8
8
  from . import curl as curl
9
9
  from . import form_strategies as form_strategies
10
10
  from . import playwright as playwright
11
+ from . import pytest_http as pytest_http
11
12
  from . import vitest as vitest
12
13
 
13
14
  __all__ = [
@@ -19,5 +20,6 @@ __all__ = [
19
20
  "curl",
20
21
  "form_strategies",
21
22
  "playwright",
23
+ "pytest_http",
22
24
  "vitest",
23
25
  ]
@@ -0,0 +1,197 @@
1
+ """pytest HTTP end-to-end verification template (Python-native web E2E).
2
+
3
+ The Playwright template (``playwright.py``) drives a BROWSER e2e against
4
+ ``*.spec.ts`` files under a node toolchain. For a **Python** web app with an
5
+ HTTP surface and no explicit browser requirement, that is the wrong runner — the
6
+ project has no ``package.json`` and verify fails with ``Cannot find module
7
+ '@playwright/test'`` (the harness, not the code, is broken). The language-aware
8
+ harness resolver (:mod:`codd.e2e_harness`) routes such projects to a Python
9
+ ``pytest`` HTTP e2e harness, and the extractor (:func:`_verification_template_ref`)
10
+ sends generated ``tests/e2e/test_*.py`` e2e nodes here.
11
+
12
+ This template runs a single Python e2e file (or the e2e directory) under
13
+ ``python -m pytest -q`` and applies the same ANTI-FALSE-GREEN executed-count
14
+ discipline the rest of the verify layer enforces (mirroring ``vitest.py``): a run
15
+ that COLLECTS/RUNS ZERO tests is a HARD FAIL — pytest exits ``5`` and prints "no
16
+ tests ran" / "collected 0 items" when it finds nothing, which must never count as
17
+ green-on-nothing.
18
+ """
19
+
20
+ from __future__ import annotations
21
+
22
+ import re
23
+ import shlex
24
+ import subprocess
25
+ import time
26
+ from collections.abc import Mapping
27
+ from pathlib import Path
28
+ from typing import Any
29
+
30
+ import yaml
31
+
32
+ from codd.deployment.providers import (
33
+ VerificationResult,
34
+ VerificationTemplate,
35
+ register_verification_template,
36
+ )
37
+
38
+
39
+ DEFAULTS_PATH = Path(__file__).parents[2] / "defaults" / "verification_templates.yaml"
40
+
41
+ #: pytest's exit code when NO tests were collected (``EXIT_NOTESTSCOLLECTED``).
42
+ _PYTEST_NO_TESTS_EXIT_CODE = 5
43
+
44
+ #: pytest's "nothing ran" signatures. pytest exits 5 (not 0) when it collects no
45
+ #: tests, so the exit code alone normally suffices — but we additionally scan the
46
+ #: output so a wrapper/plugin that swallows exit 5 (or a ``-p no:cacheprovider``
47
+ #: style harness) still cannot pass on zero collected tests.
48
+ _NO_TESTS_MARKERS: tuple[str, ...] = (
49
+ "no tests ran",
50
+ "no tests collected",
51
+ "collected 0 items",
52
+ "collected 0 item",
53
+ )
54
+ #: ``collected <N> item(s)`` / ``<N> passed`` / ``<N> failed`` — a positive
55
+ #: collected/ran signal. ``collected 0 items`` is handled by the markers above
56
+ #: (this regex requires a non-zero leading digit).
57
+ _COLLECTED_RE = re.compile(r"collected\s+([1-9]\d*)\s+items?", re.IGNORECASE)
58
+ _RAN_RE = re.compile(r"\b\d+\s+(?:passed|failed|error|errors)\b", re.IGNORECASE)
59
+
60
+
61
+ def _load_timeout_seconds() -> float:
62
+ try:
63
+ defaults = yaml.safe_load(DEFAULTS_PATH.read_text(encoding="utf-8")) or {}
64
+ except OSError:
65
+ return 120.0
66
+ timeout = defaults.get("templates", {}).get("pytest_http", {}).get("timeout", 120000)
67
+ try:
68
+ timeout_value = float(timeout)
69
+ except (TypeError, ValueError):
70
+ return 120.0
71
+ return timeout_value / 1000 if timeout_value > 1000 else timeout_value
72
+
73
+
74
+ def _project_root(runtime_state: Any) -> Path:
75
+ root = getattr(runtime_state, "project_root", None) or getattr(runtime_state, "root", None)
76
+ return Path(root) if root else Path.cwd()
77
+
78
+
79
+ @register_verification_template("pytest_http")
80
+ class PytestHttpTemplate(VerificationTemplate):
81
+ """Generate and execute ``python -m pytest`` commands for Python HTTP e2e tests."""
82
+
83
+ def __init__(self, timeout: float | None = None, config: Mapping[str, Any] | None = None) -> None:
84
+ config_map = dict(config) if isinstance(config, Mapping) else {}
85
+ configured_timeout = _positive_float(config_map.get("timeout"))
86
+ self.timeout = timeout if timeout is not None else configured_timeout or _load_timeout_seconds()
87
+
88
+ def generate_test_command(self, runtime_state, test_kind: str) -> str:
89
+ actual_check_command = getattr(runtime_state, "actual_check_command", None)
90
+ if actual_check_command:
91
+ return str(actual_check_command)
92
+
93
+ kind = test_kind.lower()
94
+ project_root = _project_root(runtime_state)
95
+ test_target = _specific_test_target(runtime_state, kind, project_root)
96
+ if test_target is None:
97
+ test_target = "tests/e2e/" if kind == "e2e" else "tests/smoke/"
98
+ # ``python -m pytest`` (not bare ``pytest``) so the project's interpreter
99
+ # /venv resolves the runner; the positional scopes the run to the e2e
100
+ # file/dir so an e2e node runs its OWN test, not the whole suite.
101
+ return f"python -m pytest -q {shlex.quote(test_target)}"
102
+
103
+ def execute(self, command: str, cwd: Path | None = None) -> VerificationResult:
104
+ started_at = time.monotonic()
105
+ try:
106
+ completed = subprocess.run(
107
+ command,
108
+ shell=True,
109
+ cwd=cwd,
110
+ capture_output=True,
111
+ text=True,
112
+ timeout=self.timeout,
113
+ )
114
+ except subprocess.TimeoutExpired as exc:
115
+ duration = time.monotonic() - started_at
116
+ output = exc.stderr or exc.stdout or f"Timed out after {self.timeout:g}s"
117
+ return VerificationResult(passed=False, output=str(output), duration=duration)
118
+
119
+ duration = time.monotonic() - started_at
120
+ combined = "\n".join(part for part in (completed.stdout, completed.stderr) if part)
121
+ # ANTI-FALSE-GREEN: pytest exits 5 with "no tests ran" — a collected/ran
122
+ # count of ZERO is a HARD FAIL regardless of exit code (even 0).
123
+ if completed.returncode == _PYTEST_NO_TESTS_EXIT_CODE or _collected_zero(combined):
124
+ return VerificationResult(
125
+ passed=False,
126
+ output=(
127
+ "pytest collected/ran 0 tests (no tests ran) — "
128
+ "treated as a hard failure (anti-false-green).\n" + combined
129
+ ),
130
+ duration=duration,
131
+ )
132
+ if completed.returncode == 0:
133
+ return VerificationResult(passed=True, output=completed.stdout, duration=duration)
134
+ return VerificationResult(
135
+ passed=False,
136
+ output=completed.stderr or completed.stdout,
137
+ duration=duration,
138
+ )
139
+
140
+ #: Python test-file shapes a pytest e2e run can collect: the pytest
141
+ #: ``test_*.py`` / ``*_test.py`` conventions the generator emits under
142
+ #: ``tests/e2e/``. Discovery in the extractor must see the same shapes.
143
+ _RUNNABLE_PY_GLOBS: tuple[str, ...] = ("test_*.py", "*_test.py")
144
+
145
+ def find_spec_files(self, project_root: Path, test_kind: str) -> list[Path]:
146
+ base = "tests/e2e" if test_kind.lower() == "e2e" else "tests/smoke"
147
+ found: dict[str, Path] = {}
148
+ for leaf in self._RUNNABLE_PY_GLOBS:
149
+ for path in project_root.glob(f"{base}/**/{leaf}"):
150
+ found[str(path)] = path
151
+ return sorted(found.values())
152
+
153
+
154
+ def _collected_zero(output: str) -> bool:
155
+ """True when the pytest output proves NO test was collected/run.
156
+
157
+ Conservative: an explicit "no tests ran" / "collected 0 items" marker is a
158
+ definite zero. A run that shows a positive ``collected N items`` OR an
159
+ ``N passed/failed/error`` summary is treated as non-zero. Absent any of
160
+ those signals we do NOT force-fail here (the exit-code check in ``execute``
161
+ already catches pytest's exit 5); this guard exists to defeat a wrapper that
162
+ masks exit 5 while printing a "no tests ran" banner.
163
+ """
164
+ lowered = output.lower()
165
+ if any(marker in lowered for marker in _NO_TESTS_MARKERS):
166
+ return True
167
+ return False
168
+
169
+
170
+ def _positive_float(value: Any) -> float | None:
171
+ try:
172
+ parsed = float(value)
173
+ except (TypeError, ValueError):
174
+ return None
175
+ return parsed if parsed > 0 else None
176
+
177
+
178
+ def _specific_test_target(runtime_state: Any, test_kind: str, project_root: Path) -> str | None:
179
+ source = getattr(runtime_state, "source", None)
180
+ if not source:
181
+ return None
182
+ source_text = str(source).strip()
183
+ if not source_text:
184
+ return None
185
+ expected_prefix = "tests/e2e/" if test_kind == "e2e" else "tests/smoke/"
186
+ normalized = source_text.replace("\\", "/")
187
+ if not normalized.startswith(expected_prefix):
188
+ return None
189
+
190
+ path = Path(source_text)
191
+ candidate = path if path.is_absolute() else project_root / path
192
+ if not candidate.is_file():
193
+ return None
194
+ try:
195
+ return candidate.relative_to(project_root).as_posix()
196
+ except ValueError:
197
+ return str(candidate)
@@ -0,0 +1,177 @@
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
+ )