codd-dev 2.50.0__tar.gz → 2.52.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.50.0 → codd_dev-2.52.0}/PKG-INFO +1 -1
  2. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/__init__.py +1 -1
  3. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/vb_marker_authenticity.py +482 -10
  4. {codd_dev-2.50.0 → codd_dev-2.52.0}/pyproject.toml +1 -1
  5. {codd_dev-2.50.0 → codd_dev-2.52.0}/.gitignore +0 -0
  6. {codd_dev-2.50.0 → codd_dev-2.52.0}/LICENSE +0 -0
  7. {codd_dev-2.50.0 → codd_dev-2.52.0}/README.md +0 -0
  8. {codd_dev-2.50.0 → codd_dev-2.52.0}/bench_fixture/README.md +0 -0
  9. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/__main__.py +0 -0
  10. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/_git_helper.py +0 -0
  11. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/action_outcome.py +0 -0
  12. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/ai_invoke.py +0 -0
  13. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/ai_patch.py +0 -0
  14. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/artifact_contract.py +0 -0
  15. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/artifact_ids.py +0 -0
  16. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/artifacts/catalog.yaml +0 -0
  17. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/ask_user_question_adapter.py +0 -0
  18. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/assembler.py +0 -0
  19. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/bridge.py +0 -0
  20. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/brownfield/__init__.py +0 -0
  21. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/brownfield/pipeline.py +0 -0
  22. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/capability_completeness.py +0 -0
  23. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/claude_cli.py +0 -0
  24. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/cli.py +0 -0
  25. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/clustering.py +0 -0
  26. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/coherence_adapters.py +0 -0
  27. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/coherence_engine.py +0 -0
  28. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/confidence.py +0 -0
  29. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/config.py +0 -0
  30. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/config_schema.py +0 -0
  31. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/contracts.py +0 -0
  32. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/contracts_registry/__init__.py +0 -0
  33. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/contracts_registry/__main__.py +0 -0
  34. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/contracts_registry/certify.py +0 -0
  35. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/contracts_registry/generate_matrix.py +0 -0
  36. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/contracts_registry/registry.py +0 -0
  37. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/coverage_auditor.py +0 -0
  38. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/coverage_execution_coherence.py +0 -0
  39. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/coverage_metrics.py +0 -0
  40. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/dag/__init__.py +0 -0
  41. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/dag/auto_repair.py +0 -0
  42. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/dag/builder.py +0 -0
  43. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/dag/checks/__init__.py +0 -0
  44. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/dag/checks/_one_to_many_detection.py +0 -0
  45. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/dag/checks/artifact_contract_check.py +0 -0
  46. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/dag/checks/ci_health.py +0 -0
  47. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/dag/checks/dependency_freshness.py +0 -0
  48. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/dag/checks/depends_on_consistency.py +0 -0
  49. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/dag/checks/deployment_completeness.py +0 -0
  50. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/dag/checks/edge_validity.py +0 -0
  51. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/dag/checks/environment_coverage.py +0 -0
  52. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/dag/checks/implementation_coverage.py +0 -0
  53. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/dag/checks/node_completeness.py +0 -0
  54. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/dag/checks/opt_out.py +0 -0
  55. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/dag/checks/task_completion.py +0 -0
  56. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/dag/checks/transitive_closure.py +0 -0
  57. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/dag/checks/ui_coherence.py +0 -0
  58. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/dag/checks/user_journey_coherence.py +0 -0
  59. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/dag/coverage_axes.py +0 -0
  60. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/dag/defaults/cli.yaml +0 -0
  61. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/dag/defaults/cpp_embedded.yaml +0 -0
  62. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/dag/defaults/csharp.yaml +0 -0
  63. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/dag/defaults/elixir.yaml +0 -0
  64. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/dag/defaults/generic.yaml +0 -0
  65. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/dag/defaults/iot.yaml +0 -0
  66. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/dag/defaults/java.yaml +0 -0
  67. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/dag/defaults/kotlin.yaml +0 -0
  68. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/dag/defaults/mobile.yaml +0 -0
  69. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/dag/defaults/ruby.yaml +0 -0
  70. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/dag/defaults/rust.yaml +0 -0
  71. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/dag/defaults/scala.yaml +0 -0
  72. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/dag/defaults/swift.yaml +0 -0
  73. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/dag/defaults/test_frameworks.yaml +0 -0
  74. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/dag/defaults/web.yaml +0 -0
  75. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/dag/extractor.py +0 -0
  76. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/dag/impact.py +0 -0
  77. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/dag/runner.py +0 -0
  78. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/defaults.py +0 -0
  79. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/defaults.yaml +0 -0
  80. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/dependency_lock_coherence.py +0 -0
  81. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/deploy_targets/__init__.py +0 -0
  82. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/deploy_targets/app_service.py +0 -0
  83. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/deploy_targets/base.py +0 -0
  84. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/deploy_targets/docker_compose.py +0 -0
  85. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/deployer.py +0 -0
  86. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/deployment/__init__.py +0 -0
  87. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/deployment/checks/__init__.py +0 -0
  88. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/deployment/defaults/deploy_targets.yaml +0 -0
  89. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/deployment/defaults/runtime_capability_inference.yaml +0 -0
  90. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/deployment/defaults/schema_providers.yaml +0 -0
  91. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/deployment/defaults/verification_templates.yaml +0 -0
  92. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/deployment/extractor.py +0 -0
  93. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/deployment/providers/__init__.py +0 -0
  94. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/deployment/providers/ai_command.py +0 -0
  95. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/deployment/providers/ai_command_factory.py +0 -0
  96. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/deployment/providers/codex_app_server.py +0 -0
  97. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/deployment/providers/llm_consideration.py +0 -0
  98. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/deployment/providers/schema/__init__.py +0 -0
  99. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/deployment/providers/schema/prisma.py +0 -0
  100. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/deployment/providers/target/__init__.py +0 -0
  101. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/deployment/providers/target/docker_compose.py +0 -0
  102. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/deployment/providers/verification/__init__.py +0 -0
  103. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/deployment/providers/verification/assertion_handlers.py +0 -0
  104. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/deployment/providers/verification/cdp_browser.py +0 -0
  105. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/deployment/providers/verification/cdp_engines.py +0 -0
  106. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/deployment/providers/verification/cdp_launchers.py +0 -0
  107. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/deployment/providers/verification/cdp_wire.py +0 -0
  108. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/deployment/providers/verification/curl.py +0 -0
  109. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/deployment/providers/verification/form_strategies.py +0 -0
  110. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/deployment/providers/verification/means_catalog.py +0 -0
  111. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/deployment/providers/verification/playwright.py +0 -0
  112. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/deployment/providers/verification/pytest_http.py +0 -0
  113. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/deployment/providers/verification/vitest.py +0 -0
  114. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/design_md.py +0 -0
  115. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/diff/__init__.py +0 -0
  116. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/diff/apply.py +0 -0
  117. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/diff/engine.py +0 -0
  118. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/diff/persistence.py +0 -0
  119. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/diff/templates/diff_prompt.md +0 -0
  120. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/discovery.py +0 -0
  121. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/drift.py +0 -0
  122. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/e2e_contract_coherence.py +0 -0
  123. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/e2e_extractor.py +0 -0
  124. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/e2e_generator.py +0 -0
  125. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/e2e_harness.py +0 -0
  126. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/e2e_runner.py +0 -0
  127. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/elicit/__init__.py +0 -0
  128. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/elicit/apply.py +0 -0
  129. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/elicit/engine.py +0 -0
  130. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/elicit/finding.py +0 -0
  131. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/elicit/formatters/__init__.py +0 -0
  132. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/elicit/formatters/base.py +0 -0
  133. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/elicit/formatters/interactive.py +0 -0
  134. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/elicit/formatters/json_fmt.py +0 -0
  135. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/elicit/formatters/md.py +0 -0
  136. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/elicit/lexicon_loader.py +0 -0
  137. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/elicit/persistence.py +0 -0
  138. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/elicit/templates/elicit_prompt_L0.md +0 -0
  139. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/env_refs.py +0 -0
  140. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/extract_ai.py +0 -0
  141. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/extract_paths.py +0 -0
  142. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/extractor.py +0 -0
  143. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/fix/__init__.py +0 -0
  144. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/fix/candidate_selector.py +0 -0
  145. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/fix/design_updater.py +0 -0
  146. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/fix/impl_propagation.py +0 -0
  147. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/fix/interactive_prompt.py +0 -0
  148. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/fix/phenomenon_fixer.py +0 -0
  149. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/fix/phenomenon_parser.py +0 -0
  150. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/fix/risk_classifier.py +0 -0
  151. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/fix/templates/clarification_question.txt +0 -0
  152. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/fix/templates/design_update.txt +0 -0
  153. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/fix/templates/impl_update.txt +0 -0
  154. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/fix/templates/phenomenon_parse.txt +0 -0
  155. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/fix/templates/risk_assessment.txt +0 -0
  156. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/fix/templates_loader.py +0 -0
  157. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/fixer.py +0 -0
  158. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/fixup_drift.py +0 -0
  159. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/fixup_drift_strategies/__init__.py +0 -0
  160. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/fixup_drift_strategies/design_token_drift.py +0 -0
  161. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/fixup_drift_strategies/lexicon_violation.py +0 -0
  162. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/fixup_drift_strategies/url_drift.py +0 -0
  163. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/frontmatter.py +0 -0
  164. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/generator.py +0 -0
  165. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/git_evidence.py +0 -0
  166. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/graph.py +0 -0
  167. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/greenfield/__init__.py +0 -0
  168. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/greenfield/pipeline.py +0 -0
  169. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/hitl_session.py +0 -0
  170. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/hooks/__init__.py +0 -0
  171. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/hooks/pre-commit +0 -0
  172. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/hooks/recipes/claude_requirements_nudge.json +0 -0
  173. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/hooks/recipes/claude_settings_example.json +0 -0
  174. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/hooks/recipes/codex_hook.sh +0 -0
  175. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/hooks/recipes/git_post_commit.sh +0 -0
  176. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/hooks/recipes/git_pre_commit.sh +0 -0
  177. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/iac_nfr.py +0 -0
  178. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/implement_oracle.py +0 -0
  179. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/implement_oracle_scope.py +0 -0
  180. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/implementer/__init__.py +0 -0
  181. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/implementer/chunked_runner.py +0 -0
  182. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/implementer/typecheck_loop.py +0 -0
  183. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/implementer.py +0 -0
  184. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/import_coherence.py +0 -0
  185. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/inheritance.py +0 -0
  186. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/init/__init__.py +0 -0
  187. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/init/lexicon_suggest.py +0 -0
  188. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/init/llm_lexicon_suggester.py +0 -0
  189. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/init/stack_detector.py +0 -0
  190. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/knowledge_fetcher.py +0 -0
  191. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/lexicon.py +0 -0
  192. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/lexicon_cli/__init__.py +0 -0
  193. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/lexicon_cli/formatters/__init__.py +0 -0
  194. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/lexicon_cli/formatters/html.py +0 -0
  195. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/lexicon_cli/formatters/json_fmt.py +0 -0
  196. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/lexicon_cli/formatters/md.py +0 -0
  197. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/lexicon_cli/inspector.py +0 -0
  198. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/lexicon_cli/manager.py +0 -0
  199. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/lexicon_cli/reporter.py +0 -0
  200. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/lexicon_cli/threshold.py +0 -0
  201. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/llm/__init__.py +0 -0
  202. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/llm/approval.py +0 -0
  203. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/llm/best_practice_augmenter.py +0 -0
  204. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/llm/criteria_expander.py +0 -0
  205. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/llm/design_doc_extractor.py +0 -0
  206. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/llm/impl_step_deriver.py +0 -0
  207. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/llm/means_catalog_loader.py +0 -0
  208. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/llm/parser.py +0 -0
  209. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/llm/plan_deriver.py +0 -0
  210. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/llm/prompt_builder.py +0 -0
  211. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/llm/strategy_validator.py +0 -0
  212. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/llm/templates/best_practice_augment_meta.md +0 -0
  213. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/llm/templates/criteria_expand_meta.md +0 -0
  214. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/llm/templates/design_doc_extract_meta.md +0 -0
  215. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/llm/templates/impl_step_derive_meta.md +0 -0
  216. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/llm/templates/implementation_step_catalog.yaml +0 -0
  217. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/llm/templates/meta_instruction.md +0 -0
  218. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/llm/templates/plan_derive_meta.md +0 -0
  219. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/llm/templates/verification_means_catalog.yaml +0 -0
  220. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/mcp_server.py +0 -0
  221. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/measure.py +0 -0
  222. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/operational_e2e_audit.py +0 -0
  223. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/operations_derive.py +0 -0
  224. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/parsing/__init__.py +0 -0
  225. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/parsing/_shared.py +0 -0
  226. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/parsing/api_specs.py +0 -0
  227. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/parsing/filesystem_routes.py +0 -0
  228. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/parsing/iac.py +0 -0
  229. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/parsing/python_ast.py +0 -0
  230. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/parsing/schemas.py +0 -0
  231. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/parsing/tests_builddeps.py +0 -0
  232. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/parsing/treesitter.py +0 -0
  233. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/planner.py +0 -0
  234. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/policy.py +0 -0
  235. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/preflight/__init__.py +0 -0
  236. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/preflight/defaults/cli.yaml +0 -0
  237. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/preflight/defaults/generic.yaml +0 -0
  238. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/preflight/defaults/iot.yaml +0 -0
  239. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/preflight/defaults/mobile.yaml +0 -0
  240. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/preflight/defaults/web.yaml +0 -0
  241. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/project_types.py +0 -0
  242. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/propagate.py +0 -0
  243. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/propagation_common.py +0 -0
  244. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/propagator.py +0 -0
  245. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/reconciliation_ledger.py +0 -0
  246. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/reference_resolution.py +0 -0
  247. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/registry.py +0 -0
  248. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/repair/__init__.py +0 -0
  249. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/repair/approval_repair.py +0 -0
  250. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/repair/auto_scope_guard.py +0 -0
  251. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/repair/engine.py +0 -0
  252. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/repair/git_patcher.py +0 -0
  253. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/repair/history.py +0 -0
  254. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/repair/llm_repair_engine.py +0 -0
  255. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/repair/loop.py +0 -0
  256. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/repair/primary_picker.py +0 -0
  257. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/repair/proof_breaks.py +0 -0
  258. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/repair/repair_result.py +0 -0
  259. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/repair/repairability_classifier.py +0 -0
  260. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/repair/schema.py +0 -0
  261. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/repair/templates/analyze_meta.md +0 -0
  262. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/repair/templates/propose_meta.md +0 -0
  263. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/repair/templates/repair_strategy_meta.md +0 -0
  264. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/repair/templates/repairability_meta.md +0 -0
  265. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/repair/test_failure_attribution.py +0 -0
  266. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/repair/verify_runner.py +0 -0
  267. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/repair_slice.py +0 -0
  268. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/require.py +0 -0
  269. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/require_plugins.py +0 -0
  270. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/require_propagate.py +0 -0
  271. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/required_artifacts/defaults/cli.yaml +0 -0
  272. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/required_artifacts/defaults/generic.yaml +0 -0
  273. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/required_artifacts/defaults/iot.yaml +0 -0
  274. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/required_artifacts/defaults/mobile.yaml +0 -0
  275. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/required_artifacts/defaults/web.yaml +0 -0
  276. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/required_artifacts_deriver.py +0 -0
  277. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/requirement_completeness/defaults/cli.yaml +0 -0
  278. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/requirement_completeness/defaults/generic.yaml +0 -0
  279. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/requirement_completeness/defaults/iot.yaml +0 -0
  280. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/requirement_completeness/defaults/mobile.yaml +0 -0
  281. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/requirement_completeness/defaults/web.yaml +0 -0
  282. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/requirement_completeness_auditor.py +0 -0
  283. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/requirement_reconciliation.py +0 -0
  284. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/requirements_meta.py +0 -0
  285. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/restoration_report.py +0 -0
  286. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/restore.py +0 -0
  287. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/routes_extractor.py +0 -0
  288. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/runtime_smoke/__init__.py +0 -0
  289. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/runtime_smoke/checks.py +0 -0
  290. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/runtime_smoke/config.py +0 -0
  291. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/runtime_smoke/report.py +0 -0
  292. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/runtime_smoke/runner.py +0 -0
  293. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/scanner.py +0 -0
  294. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/schema_refs.py +0 -0
  295. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/screen_flow_validator.py +0 -0
  296. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/screen_transition_extractor.py +0 -0
  297. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/screen_transitions/defaults.yaml +0 -0
  298. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/skills_cli/__init__.py +0 -0
  299. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/skills_cli/discovery.py +0 -0
  300. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/skills_cli/manager.py +0 -0
  301. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/skills_cli/paths.py +0 -0
  302. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/surface_reconciliation.py +0 -0
  303. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/synth.py +0 -0
  304. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/templates/codd.yaml.tmpl +0 -0
  305. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/templates/conventions.yaml.tmpl +0 -0
  306. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/templates/data_dependencies.yaml.tmpl +0 -0
  307. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/templates/doc_links.yaml.tmpl +0 -0
  308. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/templates/extract_ai_prompt_baseline.md +0 -0
  309. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/templates/extracted/api-contract.md.j2 +0 -0
  310. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/templates/extracted/architecture-overview.md.j2 +0 -0
  311. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/templates/extracted/module-detail.md.j2 +0 -0
  312. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/templates/extracted/schema-design.md.j2 +0 -0
  313. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/templates/extracted/system-context.md.j2 +0 -0
  314. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/templates/gitignore.tmpl +0 -0
  315. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/templates/lexicon_questions.md +0 -0
  316. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/templates/lexicon_schema.yaml +0 -0
  317. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/templates/overrides.yaml.tmpl +0 -0
  318. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/test_detection.py +0 -0
  319. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/test_import_coherence.py +0 -0
  320. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/traceability.py +0 -0
  321. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/validator.py +0 -0
  322. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/vb_rerun_scope.py +0 -0
  323. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/verifiable_behavior_audit.py +0 -0
  324. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/watch/__init__.py +0 -0
  325. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/watch/events.py +0 -0
  326. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/watch/propagation_log.py +0 -0
  327. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/watch/propagation_pipeline.py +0 -0
  328. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/watch/test_runner.py +0 -0
  329. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/watch/watcher.py +0 -0
  330. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/wiring.py +0 -0
  331. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ai_governance_eu_act/coverage_matrix.md +0 -0
  332. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ai_governance_eu_act/elicit_extend.md +0 -0
  333. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ai_governance_eu_act/lexicon.yaml +0 -0
  334. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ai_governance_eu_act/manifest.yaml +0 -0
  335. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ai_governance_eu_act/recommended_kinds.yaml +0 -0
  336. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ai_governance_eu_act/severity_rules.yaml +0 -0
  337. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/api_rate_limiting_caching/coverage_matrix.md +0 -0
  338. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/api_rate_limiting_caching/elicit_extend.md +0 -0
  339. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/api_rate_limiting_caching/lexicon.yaml +0 -0
  340. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/api_rate_limiting_caching/manifest.yaml +0 -0
  341. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/api_rate_limiting_caching/recommended_kinds.yaml +0 -0
  342. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/api_rate_limiting_caching/severity_rules.yaml +0 -0
  343. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/api_rest_openapi/coverage_matrix.md +0 -0
  344. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/api_rest_openapi/elicit_extend.md +0 -0
  345. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/api_rest_openapi/lexicon.yaml +0 -0
  346. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/api_rest_openapi/manifest.yaml +0 -0
  347. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/api_rest_openapi/recommended_kinds.yaml +0 -0
  348. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/api_rest_openapi/severity_rules.yaml +0 -0
  349. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/babok/elicit_extend.md +0 -0
  350. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/babok/lexicon.yaml +0 -0
  351. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/babok/manifest.yaml +0 -0
  352. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/babok/recommended_kinds.yaml +0 -0
  353. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/babok/severity_rules.yaml +0 -0
  354. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/backend_event_cloudevents/coverage_matrix.md +0 -0
  355. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/backend_event_cloudevents/elicit_extend.md +0 -0
  356. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/backend_event_cloudevents/lexicon.yaml +0 -0
  357. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/backend_event_cloudevents/manifest.yaml +0 -0
  358. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/backend_event_cloudevents/recommended_kinds.yaml +0 -0
  359. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/backend_event_cloudevents/severity_rules.yaml +0 -0
  360. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/backend_graphql/coverage_matrix.md +0 -0
  361. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/backend_graphql/elicit_extend.md +0 -0
  362. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/backend_graphql/lexicon.yaml +0 -0
  363. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/backend_graphql/manifest.yaml +0 -0
  364. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/backend_graphql/recommended_kinds.yaml +0 -0
  365. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/backend_graphql/severity_rules.yaml +0 -0
  366. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/backend_grpc_proto/coverage_matrix.md +0 -0
  367. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/backend_grpc_proto/elicit_extend.md +0 -0
  368. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/backend_grpc_proto/lexicon.yaml +0 -0
  369. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/backend_grpc_proto/manifest.yaml +0 -0
  370. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/backend_grpc_proto/recommended_kinds.yaml +0 -0
  371. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/backend_grpc_proto/severity_rules.yaml +0 -0
  372. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/compliance_hipaa/coverage_matrix.md +0 -0
  373. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/compliance_hipaa/elicit_extend.md +0 -0
  374. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/compliance_hipaa/lexicon.yaml +0 -0
  375. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/compliance_hipaa/manifest.yaml +0 -0
  376. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/compliance_hipaa/recommended_kinds.yaml +0 -0
  377. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/compliance_hipaa/severity_rules.yaml +0 -0
  378. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/compliance_iso27001/coverage_matrix.md +0 -0
  379. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/compliance_iso27001/elicit_extend.md +0 -0
  380. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/compliance_iso27001/lexicon.yaml +0 -0
  381. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/compliance_iso27001/manifest.yaml +0 -0
  382. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/compliance_iso27001/recommended_kinds.yaml +0 -0
  383. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/compliance_iso27001/severity_rules.yaml +0 -0
  384. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/compliance_pci_dss_4/coverage_matrix.md +0 -0
  385. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/compliance_pci_dss_4/elicit_extend.md +0 -0
  386. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/compliance_pci_dss_4/lexicon.yaml +0 -0
  387. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/compliance_pci_dss_4/manifest.yaml +0 -0
  388. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/compliance_pci_dss_4/recommended_kinds.yaml +0 -0
  389. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/compliance_pci_dss_4/severity_rules.yaml +0 -0
  390. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/data_aggregation_policies/coverage_matrix.md +0 -0
  391. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/data_aggregation_policies/elicit_extend.md +0 -0
  392. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/data_aggregation_policies/lexicon.yaml +0 -0
  393. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/data_aggregation_policies/manifest.yaml +0 -0
  394. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/data_aggregation_policies/recommended_kinds.yaml +0 -0
  395. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/data_aggregation_policies/severity_rules.yaml +0 -0
  396. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/coverage_matrix.md +0 -0
  397. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/elicit_extend.md +0 -0
  398. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/lexicon.yaml +0 -0
  399. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/manifest.yaml +0 -0
  400. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/recommended_kinds.yaml +0 -0
  401. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/severity_rules.yaml +0 -0
  402. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/data_governance_appi_gdpr/coverage_matrix.md +0 -0
  403. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/data_governance_appi_gdpr/elicit_extend.md +0 -0
  404. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/data_governance_appi_gdpr/lexicon.yaml +0 -0
  405. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/data_governance_appi_gdpr/manifest.yaml +0 -0
  406. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/data_governance_appi_gdpr/recommended_kinds.yaml +0 -0
  407. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/data_governance_appi_gdpr/severity_rules.yaml +0 -0
  408. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/data_nosql_jsonschema/coverage_matrix.md +0 -0
  409. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/data_nosql_jsonschema/elicit_extend.md +0 -0
  410. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/data_nosql_jsonschema/lexicon.yaml +0 -0
  411. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/data_nosql_jsonschema/manifest.yaml +0 -0
  412. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/data_nosql_jsonschema/recommended_kinds.yaml +0 -0
  413. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/data_nosql_jsonschema/severity_rules.yaml +0 -0
  414. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/data_relational_iso_sql/coverage_matrix.md +0 -0
  415. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/data_relational_iso_sql/elicit_extend.md +0 -0
  416. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/data_relational_iso_sql/lexicon.yaml +0 -0
  417. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/data_relational_iso_sql/manifest.yaml +0 -0
  418. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/data_relational_iso_sql/recommended_kinds.yaml +0 -0
  419. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/data_relational_iso_sql/severity_rules.yaml +0 -0
  420. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ddd_domain_driven_design/coverage_matrix.md +0 -0
  421. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ddd_domain_driven_design/elicit_extend.md +0 -0
  422. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ddd_domain_driven_design/lexicon.yaml +0 -0
  423. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ddd_domain_driven_design/manifest.yaml +0 -0
  424. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ddd_domain_driven_design/recommended_kinds.yaml +0 -0
  425. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ddd_domain_driven_design/severity_rules.yaml +0 -0
  426. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/dora_sre_metrics/coverage_matrix.md +0 -0
  427. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/dora_sre_metrics/elicit_extend.md +0 -0
  428. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/dora_sre_metrics/lexicon.yaml +0 -0
  429. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/dora_sre_metrics/manifest.yaml +0 -0
  430. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/dora_sre_metrics/recommended_kinds.yaml +0 -0
  431. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/dora_sre_metrics/severity_rules.yaml +0 -0
  432. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/i18n_unicode_cldr/coverage_matrix.md +0 -0
  433. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/i18n_unicode_cldr/elicit_extend.md +0 -0
  434. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/i18n_unicode_cldr/lexicon.yaml +0 -0
  435. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/i18n_unicode_cldr/manifest.yaml +0 -0
  436. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/i18n_unicode_cldr/recommended_kinds.yaml +0 -0
  437. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/i18n_unicode_cldr/severity_rules.yaml +0 -0
  438. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ml_model_cards/coverage_matrix.md +0 -0
  439. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ml_model_cards/elicit_extend.md +0 -0
  440. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ml_model_cards/lexicon.yaml +0 -0
  441. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ml_model_cards/manifest.yaml +0 -0
  442. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ml_model_cards/recommended_kinds.yaml +0 -0
  443. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ml_model_cards/severity_rules.yaml +0 -0
  444. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/mobile_a11y_native/coverage_matrix.md +0 -0
  445. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/mobile_a11y_native/elicit_extend.md +0 -0
  446. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/mobile_a11y_native/lexicon.yaml +0 -0
  447. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/mobile_a11y_native/manifest.yaml +0 -0
  448. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/mobile_a11y_native/recommended_kinds.yaml +0 -0
  449. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/mobile_a11y_native/severity_rules.yaml +0 -0
  450. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/mobile_android_material3/coverage_matrix.md +0 -0
  451. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/mobile_android_material3/elicit_extend.md +0 -0
  452. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/mobile_android_material3/lexicon.yaml +0 -0
  453. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/mobile_android_material3/manifest.yaml +0 -0
  454. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/mobile_android_material3/recommended_kinds.yaml +0 -0
  455. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/mobile_android_material3/severity_rules.yaml +0 -0
  456. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/mobile_ios_hig/coverage_matrix.md +0 -0
  457. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/mobile_ios_hig/elicit_extend.md +0 -0
  458. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/mobile_ios_hig/lexicon.yaml +0 -0
  459. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/mobile_ios_hig/manifest.yaml +0 -0
  460. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/mobile_ios_hig/recommended_kinds.yaml +0 -0
  461. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/mobile_ios_hig/severity_rules.yaml +0 -0
  462. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/mobile_security_masvs/coverage_matrix.md +0 -0
  463. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/mobile_security_masvs/elicit_extend.md +0 -0
  464. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/mobile_security_masvs/lexicon.yaml +0 -0
  465. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/mobile_security_masvs/manifest.yaml +0 -0
  466. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/mobile_security_masvs/recommended_kinds.yaml +0 -0
  467. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/mobile_security_masvs/severity_rules.yaml +0 -0
  468. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ops_cicd_pipeline/coverage_matrix.md +0 -0
  469. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ops_cicd_pipeline/elicit_extend.md +0 -0
  470. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ops_cicd_pipeline/lexicon.yaml +0 -0
  471. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ops_cicd_pipeline/manifest.yaml +0 -0
  472. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ops_cicd_pipeline/recommended_kinds.yaml +0 -0
  473. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ops_cicd_pipeline/severity_rules.yaml +0 -0
  474. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ops_iac_terraform/coverage_matrix.md +0 -0
  475. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ops_iac_terraform/elicit_extend.md +0 -0
  476. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ops_iac_terraform/lexicon.yaml +0 -0
  477. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ops_iac_terraform/manifest.yaml +0 -0
  478. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ops_iac_terraform/recommended_kinds.yaml +0 -0
  479. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ops_iac_terraform/severity_rules.yaml +0 -0
  480. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ops_kubernetes/coverage_matrix.md +0 -0
  481. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ops_kubernetes/elicit_extend.md +0 -0
  482. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ops_kubernetes/lexicon.yaml +0 -0
  483. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ops_kubernetes/manifest.yaml +0 -0
  484. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ops_kubernetes/recommended_kinds.yaml +0 -0
  485. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ops_kubernetes/severity_rules.yaml +0 -0
  486. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ops_observability_otel/coverage_matrix.md +0 -0
  487. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ops_observability_otel/elicit_extend.md +0 -0
  488. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ops_observability_otel/lexicon.yaml +0 -0
  489. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ops_observability_otel/manifest.yaml +0 -0
  490. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ops_observability_otel/recommended_kinds.yaml +0 -0
  491. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ops_observability_otel/severity_rules.yaml +0 -0
  492. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/process_iso25010/coverage_matrix.md +0 -0
  493. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/process_iso25010/elicit_extend.md +0 -0
  494. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/process_iso25010/lexicon.yaml +0 -0
  495. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/process_iso25010/manifest.yaml +0 -0
  496. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/process_iso25010/recommended_kinds.yaml +0 -0
  497. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/process_iso25010/severity_rules.yaml +0 -0
  498. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/process_test_iso29119/coverage_matrix.md +0 -0
  499. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/process_test_iso29119/elicit_extend.md +0 -0
  500. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/process_test_iso29119/lexicon.yaml +0 -0
  501. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/process_test_iso29119/manifest.yaml +0 -0
  502. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/process_test_iso29119/recommended_kinds.yaml +0 -0
  503. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/process_test_iso29119/severity_rules.yaml +0 -0
  504. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/twelve_factor_app/coverage_matrix.md +0 -0
  505. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/twelve_factor_app/elicit_extend.md +0 -0
  506. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/twelve_factor_app/lexicon.yaml +0 -0
  507. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/twelve_factor_app/manifest.yaml +0 -0
  508. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/twelve_factor_app/recommended_kinds.yaml +0 -0
  509. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/twelve_factor_app/severity_rules.yaml +0 -0
  510. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/coverage_matrix.md +0 -0
  511. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/elicit_extend.md +0 -0
  512. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/lexicon.yaml +0 -0
  513. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/manifest.yaml +0 -0
  514. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/recommended_kinds.yaml +0 -0
  515. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/severity_rules.yaml +0 -0
  516. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_authn_webauthn/coverage_matrix.md +0 -0
  517. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_authn_webauthn/elicit_extend.md +0 -0
  518. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_authn_webauthn/lexicon.yaml +0 -0
  519. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_authn_webauthn/manifest.yaml +0 -0
  520. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_authn_webauthn/recommended_kinds.yaml +0 -0
  521. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_authn_webauthn/severity_rules.yaml +0 -0
  522. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_browser_compat/coverage_matrix.md +0 -0
  523. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_browser_compat/elicit_extend.md +0 -0
  524. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_browser_compat/lexicon.yaml +0 -0
  525. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_browser_compat/manifest.yaml +0 -0
  526. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_browser_compat/recommended_kinds.yaml +0 -0
  527. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_browser_compat/severity_rules.yaml +0 -0
  528. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_forms_html5/coverage_matrix.md +0 -0
  529. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_forms_html5/elicit_extend.md +0 -0
  530. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_forms_html5/lexicon.yaml +0 -0
  531. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_forms_html5/manifest.yaml +0 -0
  532. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_forms_html5/recommended_kinds.yaml +0 -0
  533. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_forms_html5/severity_rules.yaml +0 -0
  534. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_performance_core_web_vitals/coverage_matrix.md +0 -0
  535. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_performance_core_web_vitals/elicit_extend.md +0 -0
  536. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_performance_core_web_vitals/lexicon.yaml +0 -0
  537. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_performance_core_web_vitals/manifest.yaml +0 -0
  538. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_performance_core_web_vitals/recommended_kinds.yaml +0 -0
  539. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_performance_core_web_vitals/severity_rules.yaml +0 -0
  540. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_pwa_manifest/coverage_matrix.md +0 -0
  541. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_pwa_manifest/elicit_extend.md +0 -0
  542. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_pwa_manifest/lexicon.yaml +0 -0
  543. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_pwa_manifest/manifest.yaml +0 -0
  544. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_pwa_manifest/recommended_kinds.yaml +0 -0
  545. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_pwa_manifest/severity_rules.yaml +0 -0
  546. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_responsive/coverage_matrix.md +0 -0
  547. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_responsive/elicit_extend.md +0 -0
  548. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_responsive/lexicon.yaml +0 -0
  549. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_responsive/manifest.yaml +0 -0
  550. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_responsive/recommended_kinds.yaml +0 -0
  551. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_responsive/severity_rules.yaml +0 -0
  552. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_security_owasp/coverage_matrix.md +0 -0
  553. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_security_owasp/elicit_extend.md +0 -0
  554. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_security_owasp/lexicon.yaml +0 -0
  555. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_security_owasp/manifest.yaml +0 -0
  556. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_security_owasp/recommended_kinds.yaml +0 -0
  557. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_security_owasp/severity_rules.yaml +0 -0
  558. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_seo_schemaorg/coverage_matrix.md +0 -0
  559. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_seo_schemaorg/elicit_extend.md +0 -0
  560. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_seo_schemaorg/lexicon.yaml +0 -0
  561. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_seo_schemaorg/manifest.yaml +0 -0
  562. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_seo_schemaorg/recommended_kinds.yaml +0 -0
  563. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_seo_schemaorg/severity_rules.yaml +0 -0
  564. {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/stack_map.yaml +0 -0
  565. {codd_dev-2.50.0 → codd_dev-2.52.0}/docs/cookbook/cdp_browser/README.md +0 -0
  566. {codd_dev-2.50.0 → codd_dev-2.52.0}/docs/cookbook/presentation_aggregation/README.md +0 -0
  567. {codd_dev-2.50.0 → codd_dev-2.52.0}/docs/requirements/README.md +0 -0
  568. {codd_dev-2.50.0 → codd_dev-2.52.0}/dogfood/README.md +0 -0
  569. {codd_dev-2.50.0 → codd_dev-2.52.0}/dogfood/fixtures/flat_py_app/README.md +0 -0
  570. {codd_dev-2.50.0 → codd_dev-2.52.0}/examples/README.md +0 -0
  571. {codd_dev-2.50.0 → codd_dev-2.52.0}/skills/codd-assemble/SKILL.md +0 -0
  572. {codd_dev-2.50.0 → codd_dev-2.52.0}/skills/codd-evolve/SKILL.md +0 -0
  573. {codd_dev-2.50.0 → codd_dev-2.52.0}/skills/codd-generate/SKILL.md +0 -0
  574. {codd_dev-2.50.0 → codd_dev-2.52.0}/skills/codd-greenfield/SKILL.md +0 -0
  575. {codd_dev-2.50.0 → codd_dev-2.52.0}/skills/codd-impact/SKILL.md +0 -0
  576. {codd_dev-2.50.0 → codd_dev-2.52.0}/skills/codd-init/SKILL.md +0 -0
  577. {codd_dev-2.50.0 → codd_dev-2.52.0}/skills/codd-propagate/SKILL.md +0 -0
  578. {codd_dev-2.50.0 → codd_dev-2.52.0}/skills/codd-restore/SKILL.md +0 -0
  579. {codd_dev-2.50.0 → codd_dev-2.52.0}/skills/codd-scan/SKILL.md +0 -0
  580. {codd_dev-2.50.0 → codd_dev-2.52.0}/skills/codd-validate/SKILL.md +0 -0
  581. {codd_dev-2.50.0 → codd_dev-2.52.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.50.0
3
+ Version: 2.52.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.50.0"
3
+ __version__ = "2.52.0"
@@ -39,11 +39,22 @@ each later stage only strengthens, never replaces, the earlier ones:
39
39
  helper (``expectSuccessfulRun(result, fixture.stdout)`` whose body runs the
40
40
  real ``expect(result.exitCode).toBe(0)``). Evidence is therefore::
41
41
 
42
- direct primitive assertion in the test body
42
+ a direct primitive assertion in the test body that is NOT constant-only
43
43
  OR
44
44
  a call to a RESOLVED helper whose body contains a primitive assertion/fail
45
45
  AND references the helper's argument(s) (an "argument anchor")
46
46
 
47
+ A DIRECT primitive assertion is credited only when it references at least one
48
+ non-ignored name (a SUT call, exception, state, local, or output). A
49
+ CONSTANT-only direct assertion (``assert True`` / ``assert 1 == 1`` /
50
+ ``expect(true).toBe(true)``) references nothing but assertion APIs, literals,
51
+ keywords and obvious builtins — it proves nothing, so it is NOT evidence (the
52
+ direct-side analogue of the helper-side argument anchor that already rejects a
53
+ constant-only helper). It is NOT, however, a dataflow analysis: a
54
+ local-constant alias (``x = True; assert x``) is a deliberate, documented
55
+ residual — closing it risks false-RED on legitimate callback / mutation tests
56
+ (``called = False; …; assert called``).
57
+
47
58
  The argument anchor is what keeps this anti-false-green: a no-op helper
48
59
  (``function expectSuccess() { expect(true).toBe(true); }``) does not reference
49
60
  its arguments, so marker-spam delegating to it still FAILS. The helper NAME
@@ -81,6 +92,7 @@ from __future__ import annotations
81
92
 
82
93
  import ast
83
94
  import re
95
+ import textwrap
84
96
  from dataclasses import dataclass, field
85
97
  from pathlib import Path
86
98
  from typing import Any, Callable, Iterable, Protocol
@@ -134,6 +146,9 @@ class TestBlock:
134
146
  #: ``ok`` is True iff the block carries credible assertion evidence. ``reason``
135
147
  #: is a machine token the gate maps to a violation kind / message:
136
148
  #: ``direct`` — a direct primitive assertion in the body (pass)
149
+ #: ``constant_direct`` — a direct primitive assertion that is CONSTANT-only
150
+ #: (``assert True`` / ``expect(true).toBe(true)``) —
151
+ #: references no non-ignored name, so proves nothing
137
152
  #: ``helper_resolved`` — a resolved helper with primitive + arg anchor (pass)
138
153
  #: ``no_assertion`` — neither a primitive nor any assertion-like call
139
154
  #: ``unresolved_helper`` — an assertion-like call not resolvable 1-hop
@@ -407,6 +422,53 @@ def _first_child_block(group: TestBlock, blocks: list[TestBlock]) -> TestBlock |
407
422
  # ---------------------------------------------------------------------------
408
423
 
409
424
 
425
+ def _helper_evidence(
426
+ adapter: TestBlockProfile,
427
+ block: TestBlock,
428
+ *,
429
+ importer_text: str,
430
+ importer_rel: str,
431
+ project_root: Path,
432
+ ) -> AssertionEvidence:
433
+ """Resolve a block's DELEGATED-assertion (helper) evidence, fail-closed.
434
+
435
+ Thin wrapper over the per-profile :meth:`TestBlockProfile.resolve_assertion_
436
+ evidence`: a resolver that raises is treated as NO evidence (toward
437
+ false-RED, never false-GREEN) rather than crashing the gate.
438
+ """
439
+
440
+ try:
441
+ return adapter.resolve_assertion_evidence(
442
+ block,
443
+ importer_text=importer_text,
444
+ importer_rel=importer_rel,
445
+ project_root=project_root,
446
+ )
447
+ except Exception: # noqa: BLE001 — resolver that throws ⇒ no evidence.
448
+ return AssertionEvidence(ok=False, reason="no_assertion", detail="resolver error")
449
+
450
+
451
+ def _direct_evidence(adapter: TestBlockProfile, block: TestBlock) -> AssertionEvidence:
452
+ """Resolve a block's DIRECT (in-body) primitive-assertion evidence.
453
+
454
+ The built-in Python/TypeScript adapters expose
455
+ ``resolve_direct_assertion_evidence`` which decides whether the direct
456
+ primitive assertion is constant-only (``constant_direct`` ⇒ not ok) or
457
+ references a real name (``direct`` ⇒ ok). An EXTERNAL adapter that predates
458
+ this method has no such hook; for back-compat it keeps the pre-existing
459
+ behavior (a raw primitive is credited as ``direct``) — only the built-in
460
+ stacks are tightened here.
461
+ """
462
+
463
+ resolver = getattr(adapter, "resolve_direct_assertion_evidence", None)
464
+ if callable(resolver):
465
+ try:
466
+ return resolver(block)
467
+ except Exception: # noqa: BLE001 — a resolver that throws ⇒ keep credit (back-compat).
468
+ return AssertionEvidence(ok=True, reason="direct")
469
+ return AssertionEvidence(ok=True, reason="direct")
470
+
471
+
410
472
  def build_authenticity_report(
411
473
  project_root: Path | str,
412
474
  *,
@@ -582,20 +644,34 @@ def build_authenticity_report(
582
644
  continue
583
645
 
584
646
  # ── Stage 3 (assertion EVIDENCE): direct primitive OR resolved helper ──
647
+ # A DIRECT primitive assertion must not be CONSTANT-only. ``assert
648
+ # True`` / ``expect(true).toBe(true)`` is a primitive (so
649
+ # ``has_assertion`` is True) yet proves nothing — the direct-side
650
+ # analogue of the helper-side argument anchor. We resolve direct
651
+ # evidence through ``_direct_evidence`` (per-profile, AST for Python /
652
+ # lexical for TS); if it is constant-only we DO NOT immediately fail —
653
+ # the same block may ALSO call a credible helper, so we fall back to
654
+ # the helper resolver and only RED when BOTH paths fail.
585
655
  if block.has_assertion:
586
- evidence = AssertionEvidence(ok=True, reason="direct")
587
- else:
588
- try:
589
- evidence = adapter.resolve_assertion_evidence(
656
+ evidence = _direct_evidence(adapter, block)
657
+ if not evidence.ok:
658
+ helper_evidence = _helper_evidence(
659
+ adapter,
590
660
  block,
591
661
  importer_text=text,
592
662
  importer_rel=rel,
593
663
  project_root=project_root,
594
664
  )
595
- except Exception: # noqa: BLE001 — resolver that throws ⇒ no evidence.
596
- evidence = AssertionEvidence(
597
- ok=False, reason="no_assertion", detail="resolver error"
598
- )
665
+ if helper_evidence.ok:
666
+ evidence = helper_evidence
667
+ else:
668
+ evidence = _helper_evidence(
669
+ adapter,
670
+ block,
671
+ importer_text=text,
672
+ importer_rel=rel,
673
+ project_root=project_root,
674
+ )
599
675
  if not evidence.ok:
600
676
  label = f" ({block.label})" if block.label else ""
601
677
  violations.append(
@@ -643,7 +719,14 @@ def _no_assertion_message(
643
719
  """
644
720
 
645
721
  head = f"{rel}:{marker.line} `codd: covers vb={marker.vb_id}` is attached to a test{label}"
646
- if evidence.reason == "unresolved_helper":
722
+ if evidence.reason == "constant_direct":
723
+ why = (
724
+ " whose direct primitive assertion is CONSTANT-only "
725
+ "(`assert True`, `assert 1 == 1`, or `expect(true).toBe(true)`) — "
726
+ "a constant assertion proves nothing. Assert against an observed result, "
727
+ "exception, state, or output that would FAIL if the behavior were broken."
728
+ )
729
+ elif evidence.reason == "unresolved_helper":
647
730
  why = (
648
731
  " whose only assertion is delegated to a helper that could not be resolved "
649
732
  f"({evidence.detail or 'no resolvable helper body'}). An unresolved assertion "
@@ -735,6 +818,301 @@ def render_authenticity_markdown(report: AuthenticityReport) -> str:
735
818
  return "\n".join(lines)
736
819
 
737
820
 
821
+ # ---------------------------------------------------------------------------
822
+ # DIRECT-assertion evidence (the direct-side analogue of the helper argument
823
+ # anchor). A primitive assertion IN THE TEST BODY is credited only when it
824
+ # references at least one NON-IGNORED name — a SUT call, exception, Enum, state,
825
+ # local, or output. A CONSTANT-only direct assertion (``assert True`` /
826
+ # ``expect(true).toBe(true)``) references nothing but assertion APIs, literals,
827
+ # keywords and obvious builtins, so it proves nothing and is NOT evidence.
828
+ #
829
+ # GENERALITY GUARDRAILS (do NOT widen the ignored sets):
830
+ # * Only assertion APIs, literals/keywords, and obvious builtins are ignored.
831
+ # SUT call names, exception classes, Enum names and local variables are NEVER
832
+ # ignored — so ``assert validate()`` (validate), ``expect(conv()).toBe(1)``
833
+ # (conv) and ``assert exc.value.code == ErrorCode.X`` (exc) stay GREEN. This
834
+ # is what prevents a false-RED on a legitimate NO-FIXTURE test.
835
+ # * No local-constant / dataflow analysis. ``x = True; assert x`` stays GREEN —
836
+ # closing it would risk false-RED on callback / mutation tests
837
+ # (``called = False; …; assert called``). It is a documented residual.
838
+ # ---------------------------------------------------------------------------
839
+
840
+
841
+ #: Python names that are NOT credit-worthy references inside a direct primitive
842
+ #: assertion: the assertion APIs themselves plus literals / keywords / obvious
843
+ #: builtins. NOTHING here is a SUT symbol — a function/Enum/exception/local name
844
+ #: is never ignored, so a real observation (``assert validate()`` /
845
+ #: ``assert exc.value.code == ErrorCode.X``) is always credited.
846
+ _PY_DIRECT_IGNORED_NAMES = frozenset(
847
+ {
848
+ "assert",
849
+ "pytest",
850
+ "self",
851
+ "cls",
852
+ "np",
853
+ "True",
854
+ "False",
855
+ "None",
856
+ "Ellipsis",
857
+ "bool",
858
+ "int",
859
+ "float",
860
+ "str",
861
+ "bytes",
862
+ "list",
863
+ "tuple",
864
+ "dict",
865
+ "set",
866
+ "frozenset",
867
+ "len",
868
+ "sum",
869
+ "min",
870
+ "max",
871
+ "all",
872
+ "any",
873
+ "isinstance",
874
+ "issubclass",
875
+ "type",
876
+ "object",
877
+ "Exception",
878
+ "BaseException",
879
+ "AssertionError",
880
+ "ValueError",
881
+ "TypeError",
882
+ "RuntimeError",
883
+ }
884
+ )
885
+
886
+
887
+ #: TypeScript/JavaScript counterpart of :data:`_PY_DIRECT_IGNORED_NAMES`: the
888
+ #: vitest/jest/chai assertion APIs, the matcher names, plus literals / keywords /
889
+ #: obvious global builtins. A SUT call name / class is never ignored, so
890
+ #: ``expect(conv()).toBe(1)`` (``conv`` remains) stays GREEN while
891
+ #: ``expect(true).toBe(true)`` (only ignored names) becomes RED.
892
+ #:
893
+ #: NOTE (TS inline-block leak — why the test-DECLARATION globals are here too):
894
+ #: unlike a Python ``def test_x():`` whose ``body_text`` starts AFTER the def
895
+ #: line, a TS leaf block's ``body_text`` for an INLINE form
896
+ #: (``it('x', () => { expect(true).toBe(true); });``) is the WHOLE ``it(...)``
897
+ #: line — so the lexical window harvests the block-declaration callee (``it`` /
898
+ #: ``test`` / ``describe``) and the arrow keyword (``async``) as "references".
899
+ #: These are vitest/jest reserved test-framework globals on the same footing as
900
+ #: ``expect`` / ``vi`` / the matchers, so they are ignored too — otherwise an
901
+ #: inline constant-only ``it('x', () => expect(true).toBe(true))`` would leak
902
+ #: ``it`` and be mis-credited ``direct``. A real observation
903
+ #: (``expect(conv()).toBe(1)``) still retains its SUT name (``conv``), so adding
904
+ #: these never false-REDs a genuine test; and were a SUT ever literally named
905
+ #: ``it``/``test``/``describe`` the only effect is a fail-CLOSED RED on that one
906
+ #: assertion (safe direction), never a false-GREEN.
907
+ _TS_DIRECT_IGNORED_NAMES = frozenset(
908
+ {
909
+ "expect",
910
+ "vi",
911
+ "assert",
912
+ "throw",
913
+ "new",
914
+ "typeof",
915
+ "instanceof",
916
+ "async",
917
+ "await",
918
+ # vitest/jest block-declaration + lifecycle globals (leak from an inline
919
+ # block's ``body_text``; see the NOTE above).
920
+ "it",
921
+ "test",
922
+ "describe",
923
+ "xit",
924
+ "xtest",
925
+ "xdescribe",
926
+ "fit",
927
+ "fdescribe",
928
+ "beforeEach",
929
+ "afterEach",
930
+ "beforeAll",
931
+ "afterAll",
932
+ "true",
933
+ "false",
934
+ "null",
935
+ "undefined",
936
+ "NaN",
937
+ "Infinity",
938
+ "toBe",
939
+ "toEqual",
940
+ "toStrictEqual",
941
+ "toThrow",
942
+ "toContain",
943
+ "toMatch",
944
+ "toHaveLength",
945
+ "Boolean",
946
+ "Number",
947
+ "String",
948
+ "Object",
949
+ "Array",
950
+ "Map",
951
+ "Set",
952
+ "Date",
953
+ "RegExp",
954
+ "Math",
955
+ "JSON",
956
+ "Promise",
957
+ "Error",
958
+ "TypeError",
959
+ "RangeError",
960
+ "SyntaxError",
961
+ }
962
+ )
963
+
964
+
965
+ def _py_callee_name(node: ast.AST) -> str:
966
+ """Dotted callee name of a call target (``pytest.raises`` / ``self.assertX``)."""
967
+
968
+ if isinstance(node, ast.Name):
969
+ return node.id
970
+ if isinstance(node, ast.Attribute):
971
+ base = _py_callee_name(node.value)
972
+ return f"{base}.{node.attr}" if base else node.attr
973
+ return ""
974
+
975
+
976
+ def _is_py_primitive_assert_node(node: ast.AST) -> bool:
977
+ """Whether ``node`` is a PRIMITIVE python assertion (mirrors ``_PY_PRIMITIVE_ASSERT_RE``).
978
+
979
+ An ``assert`` statement, a ``with pytest.raises(...)`` block, or an expression
980
+ statement calling ``pytest.fail`` / ``self.fail`` / ``self.assert*`` /
981
+ ``np.testing.assert*``. A bare call to a NAMED helper is NOT primitive (it is
982
+ resolved via the evidence graph), so it is not matched here.
983
+ """
984
+
985
+ if isinstance(node, ast.Assert):
986
+ return True
987
+ if isinstance(node, (ast.With, ast.AsyncWith)):
988
+ for item in node.items:
989
+ expr = item.context_expr
990
+ if isinstance(expr, ast.Call) and _py_callee_name(expr.func) == "pytest.raises":
991
+ return True
992
+ return False
993
+ if isinstance(node, ast.Expr) and isinstance(node.value, ast.Call):
994
+ callee = _py_callee_name(node.value.func)
995
+ return (
996
+ callee == "pytest.fail"
997
+ or callee == "self.fail"
998
+ or callee.startswith("self.assert")
999
+ or callee.startswith("np.testing.assert")
1000
+ )
1001
+ return False
1002
+
1003
+
1004
+ def _python_direct_assertion_evidence(body_text: str) -> AssertionEvidence:
1005
+ """AST verdict: does ``body_text`` carry a NON-constant direct primitive assertion?
1006
+
1007
+ For each primitive-assert node, collect every ``ast.Name`` id inside it and
1008
+ subtract :data:`_PY_DIRECT_IGNORED_NAMES`. If ANY name remains the assertion
1009
+ references a real observation (a SUT call, exception, Enum, local, or state)
1010
+ ⇒ ``direct`` (ok). If every assertion is constant-only ⇒ ``constant_direct``
1011
+ (not ok). Falls back to the lexical scanner on a syntax error so an
1012
+ un-parseable body never false-REDs here (it degrades to the line-based path,
1013
+ which itself fails OPEN per window).
1014
+ """
1015
+
1016
+ try:
1017
+ tree = ast.parse(textwrap.dedent(body_text))
1018
+ except (SyntaxError, ValueError):
1019
+ return _lexical_direct_assertion_evidence(
1020
+ body_text,
1021
+ primitive_re=_PY_PRIMITIVE_ASSERT_RE,
1022
+ ignored_names=_PY_DIRECT_IGNORED_NAMES,
1023
+ )
1024
+
1025
+ saw_primitive = False
1026
+ for node in ast.walk(tree):
1027
+ if not _is_py_primitive_assert_node(node):
1028
+ continue
1029
+ saw_primitive = True
1030
+ ids = {n.id for n in ast.walk(node) if isinstance(n, ast.Name)}
1031
+ if ids - _PY_DIRECT_IGNORED_NAMES:
1032
+ return AssertionEvidence(ok=True, reason="direct")
1033
+
1034
+ if not saw_primitive:
1035
+ # The raw regex (``has_assertion``) matched but the AST recognized no
1036
+ # primitive node (e.g. ``assert`` inside a string, or an assertion shape
1037
+ # the AST walker does not classify). Fail OPEN — keep the pre-existing
1038
+ # ``direct`` credit rather than inventing a false-RED.
1039
+ return AssertionEvidence(ok=True, reason="direct")
1040
+ return AssertionEvidence(ok=False, reason="constant_direct")
1041
+
1042
+
1043
+ def _primitive_assertion_windows(body: str, primitive_re: re.Pattern[str]) -> list[str]:
1044
+ """Each primitive-assertion line PLUS its more-indented continuation block.
1045
+
1046
+ Mirrors the window walk in :func:`_body_references_params`: an assertion's
1047
+ "window" is the matching line plus every following line indented MORE than it
1048
+ (its block) — so a context-manager assertion (``with pytest.raises(...):\\n
1049
+ fn()``) carries the ``fn()`` call into its window, while a trailing
1050
+ same-indent statement after a constant assertion is not folded in.
1051
+ """
1052
+
1053
+ lines = body.splitlines()
1054
+ windows: list[str] = []
1055
+ total = len(lines)
1056
+ for idx, line in enumerate(lines):
1057
+ if not primitive_re.search(line):
1058
+ continue
1059
+ base_indent = len(line[: len(line) - len(line.lstrip())].expandtabs())
1060
+ window = [line]
1061
+ scan = idx + 1
1062
+ while scan < total:
1063
+ nxt = lines[scan]
1064
+ if not nxt.strip():
1065
+ scan += 1
1066
+ continue
1067
+ nxt_indent = len(nxt[: len(nxt) - len(nxt.lstrip())].expandtabs())
1068
+ if nxt_indent <= base_indent:
1069
+ break
1070
+ window.append(nxt)
1071
+ scan += 1
1072
+ windows.append("\n".join(window))
1073
+ return windows
1074
+
1075
+
1076
+ def _lexical_direct_assertion_evidence(
1077
+ body_text: str,
1078
+ *,
1079
+ primitive_re: re.Pattern[str],
1080
+ ignored_names: frozenset[str],
1081
+ ) -> AssertionEvidence:
1082
+ """Lexical verdict (TS, and Python-on-syntax-error): a non-constant direct assertion.
1083
+
1084
+ For each primitive-assertion window, harvest GENUINE references via
1085
+ :func:`_rhs_reference_idents` (which already drops identifiers inside strings,
1086
+ comments, object keys, and member-property positions) and subtract
1087
+ ``ignored_names``. If any window references a non-ignored name ⇒ ``direct``
1088
+ (ok). A window whose references cannot be confidently scanned (``None`` —
1089
+ unterminated string/comment) is SKIPPED so it can never manufacture a
1090
+ false-RED. Only when EVERY window is constant-only ⇒ ``constant_direct``.
1091
+ """
1092
+
1093
+ saw_primitive = False
1094
+ for window in _primitive_assertion_windows(body_text, primitive_re):
1095
+ saw_primitive = True
1096
+ refs = _rhs_reference_idents(window)
1097
+ if refs is None:
1098
+ return AssertionEvidence(ok=True, reason="direct") # cannot scan ⇒ keep credit
1099
+ if refs - ignored_names:
1100
+ return AssertionEvidence(ok=True, reason="direct")
1101
+ if not saw_primitive:
1102
+ return AssertionEvidence(ok=True, reason="direct") # no window ⇒ keep credit
1103
+ return AssertionEvidence(ok=False, reason="constant_direct")
1104
+
1105
+
1106
+ def _typescript_direct_assertion_evidence(body_text: str) -> AssertionEvidence:
1107
+ """TS/JS direct-assertion verdict — lexical, reusing the shared window scanner."""
1108
+
1109
+ return _lexical_direct_assertion_evidence(
1110
+ body_text,
1111
+ primitive_re=_TS_PRIMITIVE_ASSERT_RE,
1112
+ ignored_names=_TS_DIRECT_IGNORED_NAMES,
1113
+ )
1114
+
1115
+
738
1116
  # ---------------------------------------------------------------------------
739
1117
  # Shared helper-resolution machinery (language-agnostic skeleton; the per-
740
1118
  # profile adapters supply the regexes/extensions for their stack).
@@ -829,6 +1207,40 @@ def _python_decorator_start_lines(text: str) -> dict[int, int]:
829
1207
  return starts
830
1208
 
831
1209
 
1210
+ def _python_test_function_nodes(
1211
+ text: str,
1212
+ ) -> list[ast.FunctionDef | ast.AsyncFunctionDef]:
1213
+ """Top-level ``test_*`` functions (module- or class-level) via AST.
1214
+
1215
+ AST is signature-layout-agnostic, so a multi-line ``def test_x(\n a,\n) -> None:``
1216
+ yields the CORRECT body extent — unlike the legacy line-scanner, which read the
1217
+ closing ``)`` line (at the def's own indent) as the body dedent and collapsed
1218
+ the body to the parameter-annotation lines (the ``no_assertion`` FALSE-RED this
1219
+ fixes). A ``test_*`` nested INSIDE another function is excluded (not a
1220
+ pytest-collected unit). Returns [] on syntax error (caller falls back to the
1221
+ line-scanner).
1222
+ """
1223
+
1224
+ try:
1225
+ tree = ast.parse(text)
1226
+ except (SyntaxError, ValueError):
1227
+ return []
1228
+ parents: dict[ast.AST, ast.AST] = {}
1229
+ for parent in ast.walk(tree):
1230
+ for child in ast.iter_child_nodes(parent):
1231
+ parents[child] = parent
1232
+ nodes: list[ast.FunctionDef | ast.AsyncFunctionDef] = []
1233
+ for node in ast.walk(tree):
1234
+ if not isinstance(node, (ast.FunctionDef, ast.AsyncFunctionDef)):
1235
+ continue
1236
+ if not str(node.name).startswith("test_"):
1237
+ continue
1238
+ if not isinstance(parents.get(node), (ast.Module, ast.ClassDef)):
1239
+ continue
1240
+ nodes.append(node)
1241
+ return sorted(nodes, key=lambda n: int(n.lineno))
1242
+
1243
+
832
1244
  @dataclass(frozen=True)
833
1245
  class PythonTestBlockProfile:
834
1246
  """pytest / unittest structural adapter.
@@ -847,6 +1259,48 @@ class PythonTestBlockProfile:
847
1259
  return rel_path.endswith(".py")
848
1260
 
849
1261
  def parse_test_blocks(self, text: str) -> list[TestBlock]:
1262
+ # AST is the authoritative body-extent source. The legacy line-scanner
1263
+ # (kept as a fallback for syntactically-invalid files) mis-reads a
1264
+ # MULTI-LINE def signature: the closing ``) -> None:`` sits at the def's
1265
+ # own indent, so it was taken as the body dedent and the body collapsed to
1266
+ # the parameter-annotation lines (a ``no_assertion`` FALSE-RED on a test
1267
+ # that genuinely asserts). AST yields the true ``body[0]..end_lineno``
1268
+ # extent regardless of signature layout, return annotation, decorators, or
1269
+ # nested defs. has_assertion stays the raw primitive check (unchanged).
1270
+ try:
1271
+ ast.parse(text)
1272
+ except (SyntaxError, ValueError):
1273
+ return self._parse_test_blocks_linescan(text)
1274
+ lines = text.splitlines()
1275
+ blocks: list[TestBlock] = []
1276
+ for node in _python_test_function_nodes(text):
1277
+ def_line = int(node.lineno)
1278
+ start_line = min(
1279
+ [int(d.lineno) for d in node.decorator_list], default=def_line
1280
+ )
1281
+ body_start = int(node.body[0].lineno) if node.body else def_line
1282
+ body_end = int(getattr(node, "end_lineno", body_start) or body_start)
1283
+ body_text = "\n".join(lines[body_start - 1 : body_end])
1284
+ skipped = bool(re.search(r"\bpytest\.skip\s*\(", body_text)) or bool(
1285
+ re.search(r"\bself\.skipTest\s*\(", body_text)
1286
+ )
1287
+ decorator_text = "\n".join(lines[start_line - 1 : def_line - 1])
1288
+ if _PY_SKIP_DECORATOR_RE.search(decorator_text):
1289
+ skipped = True
1290
+ has_assertion = bool(_PY_PRIMITIVE_ASSERT_RE.search(body_text))
1291
+ blocks.append(
1292
+ TestBlock(
1293
+ start_line=start_line,
1294
+ end_line=body_end,
1295
+ is_executable=not skipped,
1296
+ has_assertion=has_assertion,
1297
+ label=node.name,
1298
+ body_text=body_text,
1299
+ )
1300
+ )
1301
+ return blocks
1302
+
1303
+ def _parse_test_blocks_linescan(self, text: str) -> list[TestBlock]:
850
1304
  lines = text.splitlines()
851
1305
  marker_lines = _shared_marker_lines(text)
852
1306
  decorator_starts = _python_decorator_start_lines(text)
@@ -921,6 +1375,15 @@ class PythonTestBlockProfile:
921
1375
  block, importer_text=importer_text, importer_rel=importer_rel, project_root=project_root
922
1376
  )
923
1377
 
1378
+ def resolve_direct_assertion_evidence(self, block: TestBlock) -> AssertionEvidence:
1379
+ """Whether the block's DIRECT primitive assertion references a real name.
1380
+
1381
+ AST-based (``constant_direct`` when the assertion is constant-only). Called
1382
+ by the gate only when ``block.has_assertion`` is True.
1383
+ """
1384
+
1385
+ return _python_direct_assertion_evidence(block.body_text)
1386
+
924
1387
 
925
1388
  # vitest/jest: it(...) / test(...) blocks; describe(...) groups. Skip via
926
1389
  # ``.skip`` / ``.todo`` / ``xit`` / ``xtest`` / ``it.skipIf`` and a
@@ -1048,6 +1511,15 @@ class TypeScriptTestBlockProfile:
1048
1511
  block, importer_text=importer_text, importer_rel=importer_rel, project_root=project_root
1049
1512
  )
1050
1513
 
1514
+ def resolve_direct_assertion_evidence(self, block: TestBlock) -> AssertionEvidence:
1515
+ """Whether the block's DIRECT primitive assertion references a real name.
1516
+
1517
+ Lexical (``constant_direct`` when the assertion is constant-only). Called
1518
+ by the gate only when ``block.has_assertion`` is True.
1519
+ """
1520
+
1521
+ return _typescript_direct_assertion_evidence(block.body_text)
1522
+
1051
1523
  @staticmethod
1052
1524
  def _matching_close(lines: list[str], open_index: int) -> int:
1053
1525
  """1-based line of the brace that closes the block opened at ``open_index``.
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "codd-dev"
7
- version = "2.50.0"
7
+ version = "2.52.0"
8
8
  description = "CoDD: Coherence-Driven Development — cross-artifact change impact analysis"
9
9
  readme = "README.md"
10
10
  license = "MIT"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes