codd-dev 2.47.0__tar.gz → 2.49.0__tar.gz

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