codd-dev 2.48.0__tar.gz → 2.50.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.48.0 → codd_dev-2.50.0}/PKG-INFO +1 -1
  2. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/__init__.py +1 -1
  3. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/contracts_registry/registry.py +11 -5
  4. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/generator.py +128 -17
  5. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/greenfield/pipeline.py +192 -0
  6. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/vb_marker_authenticity.py +60 -20
  7. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/verifiable_behavior_audit.py +332 -0
  8. {codd_dev-2.48.0 → codd_dev-2.50.0}/pyproject.toml +1 -1
  9. {codd_dev-2.48.0 → codd_dev-2.50.0}/.gitignore +0 -0
  10. {codd_dev-2.48.0 → codd_dev-2.50.0}/LICENSE +0 -0
  11. {codd_dev-2.48.0 → codd_dev-2.50.0}/README.md +0 -0
  12. {codd_dev-2.48.0 → codd_dev-2.50.0}/bench_fixture/README.md +0 -0
  13. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/__main__.py +0 -0
  14. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/_git_helper.py +0 -0
  15. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/action_outcome.py +0 -0
  16. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/ai_invoke.py +0 -0
  17. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/ai_patch.py +0 -0
  18. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/artifact_contract.py +0 -0
  19. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/artifact_ids.py +0 -0
  20. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/artifacts/catalog.yaml +0 -0
  21. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/ask_user_question_adapter.py +0 -0
  22. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/assembler.py +0 -0
  23. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/bridge.py +0 -0
  24. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/brownfield/__init__.py +0 -0
  25. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/brownfield/pipeline.py +0 -0
  26. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/capability_completeness.py +0 -0
  27. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/claude_cli.py +0 -0
  28. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/cli.py +0 -0
  29. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/clustering.py +0 -0
  30. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/coherence_adapters.py +0 -0
  31. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/coherence_engine.py +0 -0
  32. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/confidence.py +0 -0
  33. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/config.py +0 -0
  34. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/config_schema.py +0 -0
  35. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/contracts.py +0 -0
  36. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/contracts_registry/__init__.py +0 -0
  37. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/contracts_registry/__main__.py +0 -0
  38. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/contracts_registry/certify.py +0 -0
  39. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/contracts_registry/generate_matrix.py +0 -0
  40. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/coverage_auditor.py +0 -0
  41. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/coverage_execution_coherence.py +0 -0
  42. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/coverage_metrics.py +0 -0
  43. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/dag/__init__.py +0 -0
  44. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/dag/auto_repair.py +0 -0
  45. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/dag/builder.py +0 -0
  46. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/dag/checks/__init__.py +0 -0
  47. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/dag/checks/_one_to_many_detection.py +0 -0
  48. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/dag/checks/artifact_contract_check.py +0 -0
  49. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/dag/checks/ci_health.py +0 -0
  50. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/dag/checks/dependency_freshness.py +0 -0
  51. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/dag/checks/depends_on_consistency.py +0 -0
  52. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/dag/checks/deployment_completeness.py +0 -0
  53. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/dag/checks/edge_validity.py +0 -0
  54. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/dag/checks/environment_coverage.py +0 -0
  55. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/dag/checks/implementation_coverage.py +0 -0
  56. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/dag/checks/node_completeness.py +0 -0
  57. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/dag/checks/opt_out.py +0 -0
  58. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/dag/checks/task_completion.py +0 -0
  59. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/dag/checks/transitive_closure.py +0 -0
  60. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/dag/checks/ui_coherence.py +0 -0
  61. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/dag/checks/user_journey_coherence.py +0 -0
  62. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/dag/coverage_axes.py +0 -0
  63. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/dag/defaults/cli.yaml +0 -0
  64. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/dag/defaults/cpp_embedded.yaml +0 -0
  65. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/dag/defaults/csharp.yaml +0 -0
  66. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/dag/defaults/elixir.yaml +0 -0
  67. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/dag/defaults/generic.yaml +0 -0
  68. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/dag/defaults/iot.yaml +0 -0
  69. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/dag/defaults/java.yaml +0 -0
  70. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/dag/defaults/kotlin.yaml +0 -0
  71. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/dag/defaults/mobile.yaml +0 -0
  72. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/dag/defaults/ruby.yaml +0 -0
  73. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/dag/defaults/rust.yaml +0 -0
  74. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/dag/defaults/scala.yaml +0 -0
  75. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/dag/defaults/swift.yaml +0 -0
  76. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/dag/defaults/test_frameworks.yaml +0 -0
  77. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/dag/defaults/web.yaml +0 -0
  78. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/dag/extractor.py +0 -0
  79. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/dag/impact.py +0 -0
  80. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/dag/runner.py +0 -0
  81. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/defaults.py +0 -0
  82. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/defaults.yaml +0 -0
  83. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/dependency_lock_coherence.py +0 -0
  84. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/deploy_targets/__init__.py +0 -0
  85. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/deploy_targets/app_service.py +0 -0
  86. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/deploy_targets/base.py +0 -0
  87. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/deploy_targets/docker_compose.py +0 -0
  88. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/deployer.py +0 -0
  89. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/deployment/__init__.py +0 -0
  90. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/deployment/checks/__init__.py +0 -0
  91. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/deployment/defaults/deploy_targets.yaml +0 -0
  92. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/deployment/defaults/runtime_capability_inference.yaml +0 -0
  93. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/deployment/defaults/schema_providers.yaml +0 -0
  94. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/deployment/defaults/verification_templates.yaml +0 -0
  95. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/deployment/extractor.py +0 -0
  96. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/deployment/providers/__init__.py +0 -0
  97. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/deployment/providers/ai_command.py +0 -0
  98. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/deployment/providers/ai_command_factory.py +0 -0
  99. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/deployment/providers/codex_app_server.py +0 -0
  100. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/deployment/providers/llm_consideration.py +0 -0
  101. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/deployment/providers/schema/__init__.py +0 -0
  102. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/deployment/providers/schema/prisma.py +0 -0
  103. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/deployment/providers/target/__init__.py +0 -0
  104. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/deployment/providers/target/docker_compose.py +0 -0
  105. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/deployment/providers/verification/__init__.py +0 -0
  106. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/deployment/providers/verification/assertion_handlers.py +0 -0
  107. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/deployment/providers/verification/cdp_browser.py +0 -0
  108. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/deployment/providers/verification/cdp_engines.py +0 -0
  109. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/deployment/providers/verification/cdp_launchers.py +0 -0
  110. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/deployment/providers/verification/cdp_wire.py +0 -0
  111. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/deployment/providers/verification/curl.py +0 -0
  112. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/deployment/providers/verification/form_strategies.py +0 -0
  113. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/deployment/providers/verification/means_catalog.py +0 -0
  114. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/deployment/providers/verification/playwright.py +0 -0
  115. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/deployment/providers/verification/pytest_http.py +0 -0
  116. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/deployment/providers/verification/vitest.py +0 -0
  117. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/design_md.py +0 -0
  118. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/diff/__init__.py +0 -0
  119. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/diff/apply.py +0 -0
  120. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/diff/engine.py +0 -0
  121. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/diff/persistence.py +0 -0
  122. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/diff/templates/diff_prompt.md +0 -0
  123. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/discovery.py +0 -0
  124. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/drift.py +0 -0
  125. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/e2e_contract_coherence.py +0 -0
  126. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/e2e_extractor.py +0 -0
  127. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/e2e_generator.py +0 -0
  128. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/e2e_harness.py +0 -0
  129. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/e2e_runner.py +0 -0
  130. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/elicit/__init__.py +0 -0
  131. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/elicit/apply.py +0 -0
  132. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/elicit/engine.py +0 -0
  133. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/elicit/finding.py +0 -0
  134. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/elicit/formatters/__init__.py +0 -0
  135. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/elicit/formatters/base.py +0 -0
  136. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/elicit/formatters/interactive.py +0 -0
  137. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/elicit/formatters/json_fmt.py +0 -0
  138. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/elicit/formatters/md.py +0 -0
  139. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/elicit/lexicon_loader.py +0 -0
  140. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/elicit/persistence.py +0 -0
  141. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/elicit/templates/elicit_prompt_L0.md +0 -0
  142. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/env_refs.py +0 -0
  143. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/extract_ai.py +0 -0
  144. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/extract_paths.py +0 -0
  145. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/extractor.py +0 -0
  146. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/fix/__init__.py +0 -0
  147. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/fix/candidate_selector.py +0 -0
  148. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/fix/design_updater.py +0 -0
  149. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/fix/impl_propagation.py +0 -0
  150. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/fix/interactive_prompt.py +0 -0
  151. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/fix/phenomenon_fixer.py +0 -0
  152. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/fix/phenomenon_parser.py +0 -0
  153. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/fix/risk_classifier.py +0 -0
  154. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/fix/templates/clarification_question.txt +0 -0
  155. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/fix/templates/design_update.txt +0 -0
  156. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/fix/templates/impl_update.txt +0 -0
  157. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/fix/templates/phenomenon_parse.txt +0 -0
  158. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/fix/templates/risk_assessment.txt +0 -0
  159. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/fix/templates_loader.py +0 -0
  160. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/fixer.py +0 -0
  161. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/fixup_drift.py +0 -0
  162. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/fixup_drift_strategies/__init__.py +0 -0
  163. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/fixup_drift_strategies/design_token_drift.py +0 -0
  164. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/fixup_drift_strategies/lexicon_violation.py +0 -0
  165. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/fixup_drift_strategies/url_drift.py +0 -0
  166. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/frontmatter.py +0 -0
  167. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/git_evidence.py +0 -0
  168. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/graph.py +0 -0
  169. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/greenfield/__init__.py +0 -0
  170. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/hitl_session.py +0 -0
  171. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/hooks/__init__.py +0 -0
  172. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/hooks/pre-commit +0 -0
  173. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/hooks/recipes/claude_requirements_nudge.json +0 -0
  174. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/hooks/recipes/claude_settings_example.json +0 -0
  175. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/hooks/recipes/codex_hook.sh +0 -0
  176. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/hooks/recipes/git_post_commit.sh +0 -0
  177. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/hooks/recipes/git_pre_commit.sh +0 -0
  178. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/iac_nfr.py +0 -0
  179. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/implement_oracle.py +0 -0
  180. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/implement_oracle_scope.py +0 -0
  181. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/implementer/__init__.py +0 -0
  182. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/implementer/chunked_runner.py +0 -0
  183. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/implementer/typecheck_loop.py +0 -0
  184. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/implementer.py +0 -0
  185. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/import_coherence.py +0 -0
  186. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/inheritance.py +0 -0
  187. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/init/__init__.py +0 -0
  188. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/init/lexicon_suggest.py +0 -0
  189. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/init/llm_lexicon_suggester.py +0 -0
  190. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/init/stack_detector.py +0 -0
  191. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/knowledge_fetcher.py +0 -0
  192. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/lexicon.py +0 -0
  193. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/lexicon_cli/__init__.py +0 -0
  194. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/lexicon_cli/formatters/__init__.py +0 -0
  195. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/lexicon_cli/formatters/html.py +0 -0
  196. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/lexicon_cli/formatters/json_fmt.py +0 -0
  197. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/lexicon_cli/formatters/md.py +0 -0
  198. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/lexicon_cli/inspector.py +0 -0
  199. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/lexicon_cli/manager.py +0 -0
  200. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/lexicon_cli/reporter.py +0 -0
  201. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/lexicon_cli/threshold.py +0 -0
  202. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/llm/__init__.py +0 -0
  203. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/llm/approval.py +0 -0
  204. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/llm/best_practice_augmenter.py +0 -0
  205. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/llm/criteria_expander.py +0 -0
  206. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/llm/design_doc_extractor.py +0 -0
  207. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/llm/impl_step_deriver.py +0 -0
  208. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/llm/means_catalog_loader.py +0 -0
  209. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/llm/parser.py +0 -0
  210. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/llm/plan_deriver.py +0 -0
  211. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/llm/prompt_builder.py +0 -0
  212. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/llm/strategy_validator.py +0 -0
  213. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/llm/templates/best_practice_augment_meta.md +0 -0
  214. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/llm/templates/criteria_expand_meta.md +0 -0
  215. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/llm/templates/design_doc_extract_meta.md +0 -0
  216. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/llm/templates/impl_step_derive_meta.md +0 -0
  217. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/llm/templates/implementation_step_catalog.yaml +0 -0
  218. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/llm/templates/meta_instruction.md +0 -0
  219. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/llm/templates/plan_derive_meta.md +0 -0
  220. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/llm/templates/verification_means_catalog.yaml +0 -0
  221. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/mcp_server.py +0 -0
  222. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/measure.py +0 -0
  223. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/operational_e2e_audit.py +0 -0
  224. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/operations_derive.py +0 -0
  225. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/parsing/__init__.py +0 -0
  226. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/parsing/_shared.py +0 -0
  227. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/parsing/api_specs.py +0 -0
  228. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/parsing/filesystem_routes.py +0 -0
  229. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/parsing/iac.py +0 -0
  230. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/parsing/python_ast.py +0 -0
  231. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/parsing/schemas.py +0 -0
  232. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/parsing/tests_builddeps.py +0 -0
  233. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/parsing/treesitter.py +0 -0
  234. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/planner.py +0 -0
  235. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/policy.py +0 -0
  236. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/preflight/__init__.py +0 -0
  237. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/preflight/defaults/cli.yaml +0 -0
  238. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/preflight/defaults/generic.yaml +0 -0
  239. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/preflight/defaults/iot.yaml +0 -0
  240. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/preflight/defaults/mobile.yaml +0 -0
  241. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/preflight/defaults/web.yaml +0 -0
  242. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/project_types.py +0 -0
  243. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/propagate.py +0 -0
  244. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/propagation_common.py +0 -0
  245. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/propagator.py +0 -0
  246. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/reconciliation_ledger.py +0 -0
  247. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/reference_resolution.py +0 -0
  248. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/registry.py +0 -0
  249. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/repair/__init__.py +0 -0
  250. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/repair/approval_repair.py +0 -0
  251. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/repair/auto_scope_guard.py +0 -0
  252. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/repair/engine.py +0 -0
  253. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/repair/git_patcher.py +0 -0
  254. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/repair/history.py +0 -0
  255. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/repair/llm_repair_engine.py +0 -0
  256. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/repair/loop.py +0 -0
  257. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/repair/primary_picker.py +0 -0
  258. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/repair/proof_breaks.py +0 -0
  259. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/repair/repair_result.py +0 -0
  260. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/repair/repairability_classifier.py +0 -0
  261. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/repair/schema.py +0 -0
  262. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/repair/templates/analyze_meta.md +0 -0
  263. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/repair/templates/propose_meta.md +0 -0
  264. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/repair/templates/repair_strategy_meta.md +0 -0
  265. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/repair/templates/repairability_meta.md +0 -0
  266. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/repair/test_failure_attribution.py +0 -0
  267. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/repair/verify_runner.py +0 -0
  268. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/repair_slice.py +0 -0
  269. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/require.py +0 -0
  270. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/require_plugins.py +0 -0
  271. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/require_propagate.py +0 -0
  272. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/required_artifacts/defaults/cli.yaml +0 -0
  273. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/required_artifacts/defaults/generic.yaml +0 -0
  274. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/required_artifacts/defaults/iot.yaml +0 -0
  275. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/required_artifacts/defaults/mobile.yaml +0 -0
  276. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/required_artifacts/defaults/web.yaml +0 -0
  277. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/required_artifacts_deriver.py +0 -0
  278. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/requirement_completeness/defaults/cli.yaml +0 -0
  279. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/requirement_completeness/defaults/generic.yaml +0 -0
  280. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/requirement_completeness/defaults/iot.yaml +0 -0
  281. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/requirement_completeness/defaults/mobile.yaml +0 -0
  282. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/requirement_completeness/defaults/web.yaml +0 -0
  283. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/requirement_completeness_auditor.py +0 -0
  284. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/requirement_reconciliation.py +0 -0
  285. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/requirements_meta.py +0 -0
  286. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/restoration_report.py +0 -0
  287. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/restore.py +0 -0
  288. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/routes_extractor.py +0 -0
  289. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/runtime_smoke/__init__.py +0 -0
  290. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/runtime_smoke/checks.py +0 -0
  291. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/runtime_smoke/config.py +0 -0
  292. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/runtime_smoke/report.py +0 -0
  293. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/runtime_smoke/runner.py +0 -0
  294. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/scanner.py +0 -0
  295. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/schema_refs.py +0 -0
  296. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/screen_flow_validator.py +0 -0
  297. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/screen_transition_extractor.py +0 -0
  298. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/screen_transitions/defaults.yaml +0 -0
  299. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/skills_cli/__init__.py +0 -0
  300. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/skills_cli/discovery.py +0 -0
  301. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/skills_cli/manager.py +0 -0
  302. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/skills_cli/paths.py +0 -0
  303. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/surface_reconciliation.py +0 -0
  304. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/synth.py +0 -0
  305. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/templates/codd.yaml.tmpl +0 -0
  306. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/templates/conventions.yaml.tmpl +0 -0
  307. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/templates/data_dependencies.yaml.tmpl +0 -0
  308. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/templates/doc_links.yaml.tmpl +0 -0
  309. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/templates/extract_ai_prompt_baseline.md +0 -0
  310. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/templates/extracted/api-contract.md.j2 +0 -0
  311. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/templates/extracted/architecture-overview.md.j2 +0 -0
  312. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/templates/extracted/module-detail.md.j2 +0 -0
  313. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/templates/extracted/schema-design.md.j2 +0 -0
  314. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/templates/extracted/system-context.md.j2 +0 -0
  315. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/templates/gitignore.tmpl +0 -0
  316. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/templates/lexicon_questions.md +0 -0
  317. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/templates/lexicon_schema.yaml +0 -0
  318. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/templates/overrides.yaml.tmpl +0 -0
  319. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/test_detection.py +0 -0
  320. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/test_import_coherence.py +0 -0
  321. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/traceability.py +0 -0
  322. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/validator.py +0 -0
  323. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/vb_rerun_scope.py +0 -0
  324. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/watch/__init__.py +0 -0
  325. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/watch/events.py +0 -0
  326. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/watch/propagation_log.py +0 -0
  327. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/watch/propagation_pipeline.py +0 -0
  328. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/watch/test_runner.py +0 -0
  329. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/watch/watcher.py +0 -0
  330. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd/wiring.py +0 -0
  331. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/ai_governance_eu_act/coverage_matrix.md +0 -0
  332. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/ai_governance_eu_act/elicit_extend.md +0 -0
  333. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/ai_governance_eu_act/lexicon.yaml +0 -0
  334. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/ai_governance_eu_act/manifest.yaml +0 -0
  335. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/ai_governance_eu_act/recommended_kinds.yaml +0 -0
  336. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/ai_governance_eu_act/severity_rules.yaml +0 -0
  337. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/api_rate_limiting_caching/coverage_matrix.md +0 -0
  338. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/api_rate_limiting_caching/elicit_extend.md +0 -0
  339. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/api_rate_limiting_caching/lexicon.yaml +0 -0
  340. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/api_rate_limiting_caching/manifest.yaml +0 -0
  341. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/api_rate_limiting_caching/recommended_kinds.yaml +0 -0
  342. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/api_rate_limiting_caching/severity_rules.yaml +0 -0
  343. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/api_rest_openapi/coverage_matrix.md +0 -0
  344. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/api_rest_openapi/elicit_extend.md +0 -0
  345. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/api_rest_openapi/lexicon.yaml +0 -0
  346. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/api_rest_openapi/manifest.yaml +0 -0
  347. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/api_rest_openapi/recommended_kinds.yaml +0 -0
  348. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/api_rest_openapi/severity_rules.yaml +0 -0
  349. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/babok/elicit_extend.md +0 -0
  350. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/babok/lexicon.yaml +0 -0
  351. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/babok/manifest.yaml +0 -0
  352. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/babok/recommended_kinds.yaml +0 -0
  353. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/babok/severity_rules.yaml +0 -0
  354. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/backend_event_cloudevents/coverage_matrix.md +0 -0
  355. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/backend_event_cloudevents/elicit_extend.md +0 -0
  356. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/backend_event_cloudevents/lexicon.yaml +0 -0
  357. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/backend_event_cloudevents/manifest.yaml +0 -0
  358. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/backend_event_cloudevents/recommended_kinds.yaml +0 -0
  359. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/backend_event_cloudevents/severity_rules.yaml +0 -0
  360. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/backend_graphql/coverage_matrix.md +0 -0
  361. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/backend_graphql/elicit_extend.md +0 -0
  362. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/backend_graphql/lexicon.yaml +0 -0
  363. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/backend_graphql/manifest.yaml +0 -0
  364. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/backend_graphql/recommended_kinds.yaml +0 -0
  365. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/backend_graphql/severity_rules.yaml +0 -0
  366. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/backend_grpc_proto/coverage_matrix.md +0 -0
  367. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/backend_grpc_proto/elicit_extend.md +0 -0
  368. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/backend_grpc_proto/lexicon.yaml +0 -0
  369. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/backend_grpc_proto/manifest.yaml +0 -0
  370. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/backend_grpc_proto/recommended_kinds.yaml +0 -0
  371. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/backend_grpc_proto/severity_rules.yaml +0 -0
  372. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/compliance_hipaa/coverage_matrix.md +0 -0
  373. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/compliance_hipaa/elicit_extend.md +0 -0
  374. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/compliance_hipaa/lexicon.yaml +0 -0
  375. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/compliance_hipaa/manifest.yaml +0 -0
  376. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/compliance_hipaa/recommended_kinds.yaml +0 -0
  377. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/compliance_hipaa/severity_rules.yaml +0 -0
  378. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/compliance_iso27001/coverage_matrix.md +0 -0
  379. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/compliance_iso27001/elicit_extend.md +0 -0
  380. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/compliance_iso27001/lexicon.yaml +0 -0
  381. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/compliance_iso27001/manifest.yaml +0 -0
  382. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/compliance_iso27001/recommended_kinds.yaml +0 -0
  383. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/compliance_iso27001/severity_rules.yaml +0 -0
  384. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/compliance_pci_dss_4/coverage_matrix.md +0 -0
  385. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/compliance_pci_dss_4/elicit_extend.md +0 -0
  386. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/compliance_pci_dss_4/lexicon.yaml +0 -0
  387. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/compliance_pci_dss_4/manifest.yaml +0 -0
  388. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/compliance_pci_dss_4/recommended_kinds.yaml +0 -0
  389. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/compliance_pci_dss_4/severity_rules.yaml +0 -0
  390. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/data_aggregation_policies/coverage_matrix.md +0 -0
  391. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/data_aggregation_policies/elicit_extend.md +0 -0
  392. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/data_aggregation_policies/lexicon.yaml +0 -0
  393. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/data_aggregation_policies/manifest.yaml +0 -0
  394. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/data_aggregation_policies/recommended_kinds.yaml +0 -0
  395. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/data_aggregation_policies/severity_rules.yaml +0 -0
  396. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/coverage_matrix.md +0 -0
  397. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/elicit_extend.md +0 -0
  398. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/lexicon.yaml +0 -0
  399. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/manifest.yaml +0 -0
  400. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/recommended_kinds.yaml +0 -0
  401. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/severity_rules.yaml +0 -0
  402. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/data_governance_appi_gdpr/coverage_matrix.md +0 -0
  403. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/data_governance_appi_gdpr/elicit_extend.md +0 -0
  404. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/data_governance_appi_gdpr/lexicon.yaml +0 -0
  405. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/data_governance_appi_gdpr/manifest.yaml +0 -0
  406. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/data_governance_appi_gdpr/recommended_kinds.yaml +0 -0
  407. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/data_governance_appi_gdpr/severity_rules.yaml +0 -0
  408. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/data_nosql_jsonschema/coverage_matrix.md +0 -0
  409. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/data_nosql_jsonschema/elicit_extend.md +0 -0
  410. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/data_nosql_jsonschema/lexicon.yaml +0 -0
  411. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/data_nosql_jsonschema/manifest.yaml +0 -0
  412. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/data_nosql_jsonschema/recommended_kinds.yaml +0 -0
  413. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/data_nosql_jsonschema/severity_rules.yaml +0 -0
  414. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/data_relational_iso_sql/coverage_matrix.md +0 -0
  415. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/data_relational_iso_sql/elicit_extend.md +0 -0
  416. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/data_relational_iso_sql/lexicon.yaml +0 -0
  417. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/data_relational_iso_sql/manifest.yaml +0 -0
  418. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/data_relational_iso_sql/recommended_kinds.yaml +0 -0
  419. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/data_relational_iso_sql/severity_rules.yaml +0 -0
  420. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/ddd_domain_driven_design/coverage_matrix.md +0 -0
  421. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/ddd_domain_driven_design/elicit_extend.md +0 -0
  422. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/ddd_domain_driven_design/lexicon.yaml +0 -0
  423. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/ddd_domain_driven_design/manifest.yaml +0 -0
  424. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/ddd_domain_driven_design/recommended_kinds.yaml +0 -0
  425. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/ddd_domain_driven_design/severity_rules.yaml +0 -0
  426. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/dora_sre_metrics/coverage_matrix.md +0 -0
  427. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/dora_sre_metrics/elicit_extend.md +0 -0
  428. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/dora_sre_metrics/lexicon.yaml +0 -0
  429. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/dora_sre_metrics/manifest.yaml +0 -0
  430. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/dora_sre_metrics/recommended_kinds.yaml +0 -0
  431. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/dora_sre_metrics/severity_rules.yaml +0 -0
  432. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/i18n_unicode_cldr/coverage_matrix.md +0 -0
  433. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/i18n_unicode_cldr/elicit_extend.md +0 -0
  434. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/i18n_unicode_cldr/lexicon.yaml +0 -0
  435. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/i18n_unicode_cldr/manifest.yaml +0 -0
  436. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/i18n_unicode_cldr/recommended_kinds.yaml +0 -0
  437. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/i18n_unicode_cldr/severity_rules.yaml +0 -0
  438. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/ml_model_cards/coverage_matrix.md +0 -0
  439. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/ml_model_cards/elicit_extend.md +0 -0
  440. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/ml_model_cards/lexicon.yaml +0 -0
  441. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/ml_model_cards/manifest.yaml +0 -0
  442. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/ml_model_cards/recommended_kinds.yaml +0 -0
  443. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/ml_model_cards/severity_rules.yaml +0 -0
  444. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/mobile_a11y_native/coverage_matrix.md +0 -0
  445. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/mobile_a11y_native/elicit_extend.md +0 -0
  446. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/mobile_a11y_native/lexicon.yaml +0 -0
  447. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/mobile_a11y_native/manifest.yaml +0 -0
  448. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/mobile_a11y_native/recommended_kinds.yaml +0 -0
  449. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/mobile_a11y_native/severity_rules.yaml +0 -0
  450. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/mobile_android_material3/coverage_matrix.md +0 -0
  451. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/mobile_android_material3/elicit_extend.md +0 -0
  452. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/mobile_android_material3/lexicon.yaml +0 -0
  453. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/mobile_android_material3/manifest.yaml +0 -0
  454. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/mobile_android_material3/recommended_kinds.yaml +0 -0
  455. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/mobile_android_material3/severity_rules.yaml +0 -0
  456. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/mobile_ios_hig/coverage_matrix.md +0 -0
  457. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/mobile_ios_hig/elicit_extend.md +0 -0
  458. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/mobile_ios_hig/lexicon.yaml +0 -0
  459. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/mobile_ios_hig/manifest.yaml +0 -0
  460. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/mobile_ios_hig/recommended_kinds.yaml +0 -0
  461. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/mobile_ios_hig/severity_rules.yaml +0 -0
  462. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/mobile_security_masvs/coverage_matrix.md +0 -0
  463. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/mobile_security_masvs/elicit_extend.md +0 -0
  464. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/mobile_security_masvs/lexicon.yaml +0 -0
  465. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/mobile_security_masvs/manifest.yaml +0 -0
  466. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/mobile_security_masvs/recommended_kinds.yaml +0 -0
  467. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/mobile_security_masvs/severity_rules.yaml +0 -0
  468. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/ops_cicd_pipeline/coverage_matrix.md +0 -0
  469. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/ops_cicd_pipeline/elicit_extend.md +0 -0
  470. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/ops_cicd_pipeline/lexicon.yaml +0 -0
  471. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/ops_cicd_pipeline/manifest.yaml +0 -0
  472. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/ops_cicd_pipeline/recommended_kinds.yaml +0 -0
  473. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/ops_cicd_pipeline/severity_rules.yaml +0 -0
  474. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/ops_iac_terraform/coverage_matrix.md +0 -0
  475. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/ops_iac_terraform/elicit_extend.md +0 -0
  476. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/ops_iac_terraform/lexicon.yaml +0 -0
  477. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/ops_iac_terraform/manifest.yaml +0 -0
  478. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/ops_iac_terraform/recommended_kinds.yaml +0 -0
  479. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/ops_iac_terraform/severity_rules.yaml +0 -0
  480. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/ops_kubernetes/coverage_matrix.md +0 -0
  481. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/ops_kubernetes/elicit_extend.md +0 -0
  482. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/ops_kubernetes/lexicon.yaml +0 -0
  483. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/ops_kubernetes/manifest.yaml +0 -0
  484. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/ops_kubernetes/recommended_kinds.yaml +0 -0
  485. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/ops_kubernetes/severity_rules.yaml +0 -0
  486. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/ops_observability_otel/coverage_matrix.md +0 -0
  487. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/ops_observability_otel/elicit_extend.md +0 -0
  488. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/ops_observability_otel/lexicon.yaml +0 -0
  489. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/ops_observability_otel/manifest.yaml +0 -0
  490. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/ops_observability_otel/recommended_kinds.yaml +0 -0
  491. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/ops_observability_otel/severity_rules.yaml +0 -0
  492. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/process_iso25010/coverage_matrix.md +0 -0
  493. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/process_iso25010/elicit_extend.md +0 -0
  494. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/process_iso25010/lexicon.yaml +0 -0
  495. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/process_iso25010/manifest.yaml +0 -0
  496. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/process_iso25010/recommended_kinds.yaml +0 -0
  497. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/process_iso25010/severity_rules.yaml +0 -0
  498. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/process_test_iso29119/coverage_matrix.md +0 -0
  499. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/process_test_iso29119/elicit_extend.md +0 -0
  500. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/process_test_iso29119/lexicon.yaml +0 -0
  501. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/process_test_iso29119/manifest.yaml +0 -0
  502. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/process_test_iso29119/recommended_kinds.yaml +0 -0
  503. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/process_test_iso29119/severity_rules.yaml +0 -0
  504. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/twelve_factor_app/coverage_matrix.md +0 -0
  505. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/twelve_factor_app/elicit_extend.md +0 -0
  506. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/twelve_factor_app/lexicon.yaml +0 -0
  507. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/twelve_factor_app/manifest.yaml +0 -0
  508. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/twelve_factor_app/recommended_kinds.yaml +0 -0
  509. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/twelve_factor_app/severity_rules.yaml +0 -0
  510. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/coverage_matrix.md +0 -0
  511. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/elicit_extend.md +0 -0
  512. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/lexicon.yaml +0 -0
  513. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/manifest.yaml +0 -0
  514. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/recommended_kinds.yaml +0 -0
  515. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/severity_rules.yaml +0 -0
  516. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/web_authn_webauthn/coverage_matrix.md +0 -0
  517. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/web_authn_webauthn/elicit_extend.md +0 -0
  518. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/web_authn_webauthn/lexicon.yaml +0 -0
  519. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/web_authn_webauthn/manifest.yaml +0 -0
  520. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/web_authn_webauthn/recommended_kinds.yaml +0 -0
  521. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/web_authn_webauthn/severity_rules.yaml +0 -0
  522. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/web_browser_compat/coverage_matrix.md +0 -0
  523. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/web_browser_compat/elicit_extend.md +0 -0
  524. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/web_browser_compat/lexicon.yaml +0 -0
  525. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/web_browser_compat/manifest.yaml +0 -0
  526. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/web_browser_compat/recommended_kinds.yaml +0 -0
  527. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/web_browser_compat/severity_rules.yaml +0 -0
  528. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/web_forms_html5/coverage_matrix.md +0 -0
  529. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/web_forms_html5/elicit_extend.md +0 -0
  530. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/web_forms_html5/lexicon.yaml +0 -0
  531. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/web_forms_html5/manifest.yaml +0 -0
  532. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/web_forms_html5/recommended_kinds.yaml +0 -0
  533. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/web_forms_html5/severity_rules.yaml +0 -0
  534. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/web_performance_core_web_vitals/coverage_matrix.md +0 -0
  535. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/web_performance_core_web_vitals/elicit_extend.md +0 -0
  536. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/web_performance_core_web_vitals/lexicon.yaml +0 -0
  537. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/web_performance_core_web_vitals/manifest.yaml +0 -0
  538. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/web_performance_core_web_vitals/recommended_kinds.yaml +0 -0
  539. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/web_performance_core_web_vitals/severity_rules.yaml +0 -0
  540. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/web_pwa_manifest/coverage_matrix.md +0 -0
  541. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/web_pwa_manifest/elicit_extend.md +0 -0
  542. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/web_pwa_manifest/lexicon.yaml +0 -0
  543. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/web_pwa_manifest/manifest.yaml +0 -0
  544. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/web_pwa_manifest/recommended_kinds.yaml +0 -0
  545. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/web_pwa_manifest/severity_rules.yaml +0 -0
  546. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/web_responsive/coverage_matrix.md +0 -0
  547. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/web_responsive/elicit_extend.md +0 -0
  548. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/web_responsive/lexicon.yaml +0 -0
  549. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/web_responsive/manifest.yaml +0 -0
  550. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/web_responsive/recommended_kinds.yaml +0 -0
  551. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/web_responsive/severity_rules.yaml +0 -0
  552. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/web_security_owasp/coverage_matrix.md +0 -0
  553. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/web_security_owasp/elicit_extend.md +0 -0
  554. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/web_security_owasp/lexicon.yaml +0 -0
  555. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/web_security_owasp/manifest.yaml +0 -0
  556. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/web_security_owasp/recommended_kinds.yaml +0 -0
  557. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/web_security_owasp/severity_rules.yaml +0 -0
  558. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/web_seo_schemaorg/coverage_matrix.md +0 -0
  559. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/web_seo_schemaorg/elicit_extend.md +0 -0
  560. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/web_seo_schemaorg/lexicon.yaml +0 -0
  561. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/web_seo_schemaorg/manifest.yaml +0 -0
  562. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/web_seo_schemaorg/recommended_kinds.yaml +0 -0
  563. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/lexicons/web_seo_schemaorg/severity_rules.yaml +0 -0
  564. {codd_dev-2.48.0 → codd_dev-2.50.0}/codd_plugins/stack_map.yaml +0 -0
  565. {codd_dev-2.48.0 → codd_dev-2.50.0}/docs/cookbook/cdp_browser/README.md +0 -0
  566. {codd_dev-2.48.0 → codd_dev-2.50.0}/docs/cookbook/presentation_aggregation/README.md +0 -0
  567. {codd_dev-2.48.0 → codd_dev-2.50.0}/docs/requirements/README.md +0 -0
  568. {codd_dev-2.48.0 → codd_dev-2.50.0}/dogfood/README.md +0 -0
  569. {codd_dev-2.48.0 → codd_dev-2.50.0}/dogfood/fixtures/flat_py_app/README.md +0 -0
  570. {codd_dev-2.48.0 → codd_dev-2.50.0}/examples/README.md +0 -0
  571. {codd_dev-2.48.0 → codd_dev-2.50.0}/skills/codd-assemble/SKILL.md +0 -0
  572. {codd_dev-2.48.0 → codd_dev-2.50.0}/skills/codd-evolve/SKILL.md +0 -0
  573. {codd_dev-2.48.0 → codd_dev-2.50.0}/skills/codd-generate/SKILL.md +0 -0
  574. {codd_dev-2.48.0 → codd_dev-2.50.0}/skills/codd-greenfield/SKILL.md +0 -0
  575. {codd_dev-2.48.0 → codd_dev-2.50.0}/skills/codd-impact/SKILL.md +0 -0
  576. {codd_dev-2.48.0 → codd_dev-2.50.0}/skills/codd-init/SKILL.md +0 -0
  577. {codd_dev-2.48.0 → codd_dev-2.50.0}/skills/codd-propagate/SKILL.md +0 -0
  578. {codd_dev-2.48.0 → codd_dev-2.50.0}/skills/codd-restore/SKILL.md +0 -0
  579. {codd_dev-2.48.0 → codd_dev-2.50.0}/skills/codd-scan/SKILL.md +0 -0
  580. {codd_dev-2.48.0 → codd_dev-2.50.0}/skills/codd-validate/SKILL.md +0 -0
  581. {codd_dev-2.48.0 → codd_dev-2.50.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.48.0
3
+ Version: 2.50.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.48.0"
3
+ __version__ = "2.50.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
  ),
@@ -607,33 +607,144 @@ def generate_wave(
607
607
  if output_path.exists() and not force:
608
608
  results.append(GenerationResult(node_id=artifact.node_id, path=output_path, status="skipped"))
609
609
  continue
610
-
611
- dependency_documents = _load_dependency_documents(project_root, artifact.depends_on, document_node_paths)
612
- output_path.parent.mkdir(parents=True, exist_ok=True)
613
- combined_conventions = deepcopy(global_conventions) + deepcopy(artifact.conventions)
614
- content = _render_document(
615
- artifact=artifact,
616
- global_conventions=global_conventions,
617
- depended_by=depended_by_map.get(artifact.node_id, []),
618
- body=_generate_document_body(
610
+ results.append(
611
+ _generate_one_artifact(
619
612
  artifact=artifact,
620
- dependency_documents=dependency_documents,
621
- conventions=combined_conventions,
622
- ai_command=resolved_ai_command,
623
613
  project_root=project_root,
624
- feedback=feedback,
625
- max_retries=body_max_retries,
614
+ global_conventions=global_conventions,
615
+ depended_by_map=depended_by_map,
616
+ document_node_paths=document_node_paths,
617
+ resolved_ai_command=resolved_ai_command,
618
+ body_max_retries=body_max_retries,
626
619
  capabilities=capabilities,
627
620
  project_language=project_language,
628
- ),
621
+ feedback=feedback,
622
+ )
629
623
  )
630
- output_path.write_text(content, encoding="utf-8")
631
- results.append(GenerationResult(node_id=artifact.node_id, path=output_path, status="generated"))
632
624
 
633
625
  _enforce_vb_declaration_coherence(project_root, config, results)
634
626
  return results
635
627
 
636
628
 
629
+ def _generate_one_artifact(
630
+ *,
631
+ artifact: WaveArtifact,
632
+ project_root: Path,
633
+ global_conventions: list[dict[str, Any]],
634
+ depended_by_map: dict[str, list[dict[str, Any]]],
635
+ document_node_paths: dict[str, Path],
636
+ resolved_ai_command: str,
637
+ body_max_retries: int,
638
+ capabilities: "ProjectCapabilities | None",
639
+ project_language: str | None,
640
+ feedback: str | None,
641
+ ) -> GenerationResult:
642
+ """Render ONE artifact's document and write it (overwriting any prior file).
643
+
644
+ The shared per-artifact rendering step used by both :func:`generate_wave`
645
+ (the wave loop) and :func:`regenerate_artifact` (the single-doc repair seam).
646
+ Always (re)writes the output; skip-if-exists is the wave loop's decision, not
647
+ this helper's, so a scoped repair can overwrite exactly one doc.
648
+ """
649
+
650
+ output_path = project_root / artifact.output
651
+ dependency_documents = _load_dependency_documents(
652
+ project_root, artifact.depends_on, document_node_paths
653
+ )
654
+ output_path.parent.mkdir(parents=True, exist_ok=True)
655
+ combined_conventions = deepcopy(global_conventions) + deepcopy(artifact.conventions)
656
+ content = _render_document(
657
+ artifact=artifact,
658
+ global_conventions=global_conventions,
659
+ depended_by=depended_by_map.get(artifact.node_id, []),
660
+ body=_generate_document_body(
661
+ artifact=artifact,
662
+ dependency_documents=dependency_documents,
663
+ conventions=combined_conventions,
664
+ ai_command=resolved_ai_command,
665
+ project_root=project_root,
666
+ feedback=feedback,
667
+ max_retries=body_max_retries,
668
+ capabilities=capabilities,
669
+ project_language=project_language,
670
+ ),
671
+ )
672
+ output_path.write_text(content, encoding="utf-8")
673
+ return GenerationResult(node_id=artifact.node_id, path=output_path, status="generated")
674
+
675
+
676
+ def regenerate_artifact(
677
+ project_root: Path,
678
+ *,
679
+ node_id: str | None = None,
680
+ output_path: str | None = None,
681
+ feedback: str | None = None,
682
+ ai_command: str | None = None,
683
+ ) -> GenerationResult:
684
+ """Regenerate a SINGLE wave artifact in place, scoped to one document.
685
+
686
+ The thin seam the greenfield generate-time VB-registry repair uses: it
687
+ rewrites ONLY the canonical VB doc (``docs/test/test_strategy.md``) with
688
+ repair feedback, WITHOUT re-running the whole wave (which would clobber the
689
+ sibling governance/design docs already generated). Reuses the exact wave
690
+ plumbing (:func:`_generate_one_artifact` → ``_load_dependency_documents`` /
691
+ ``_render_document`` / ``_generate_document_body``); only the artifact
692
+ selection (by ``node_id`` or ``output``) and the forced overwrite differ.
693
+
694
+ Identify the target by ``node_id`` (preferred) or ``output_path`` (the
695
+ artifact's ``output``). Raises ``ValueError`` if no/!=1 wave artifact matches
696
+ — an ambiguous or absent target must fail loudly, never silently no-op.
697
+ """
698
+
699
+ from codd.scanner import build_document_node_path_map
700
+
701
+ if not node_id and not output_path:
702
+ raise ValueError("regenerate_artifact requires node_id or output_path")
703
+
704
+ config = _load_project_config(project_root)
705
+ artifacts = _load_wave_artifacts(config)
706
+
707
+ def _matches(candidate: WaveArtifact) -> bool:
708
+ if node_id is not None and candidate.node_id == node_id:
709
+ return True
710
+ if output_path is not None:
711
+ want = output_path.replace("\\", "/").strip("/")
712
+ have = str(candidate.output).replace("\\", "/").strip("/")
713
+ if want == have:
714
+ return True
715
+ return False
716
+
717
+ matched = [artifact for artifact in artifacts if _matches(artifact)]
718
+ if not matched:
719
+ target = node_id or output_path
720
+ raise ValueError(f"wave_config has no artifact matching {target!r}")
721
+ if len(matched) > 1:
722
+ target = node_id or output_path
723
+ raise ValueError(f"wave_config has {len(matched)} artifacts matching {target!r}; ambiguous")
724
+
725
+ artifact = matched[0]
726
+ resolved_ai_command = _resolve_ai_command(config, ai_command, command_name="generate")
727
+ global_conventions = _normalize_conventions(config.get("conventions", []))
728
+ depended_by_map = _build_depended_by_map(artifacts)
729
+ document_node_paths = build_document_node_path_map(project_root, config)
730
+ body_max_retries = _body_max_retries(config)
731
+ capabilities = _resolve_generation_capabilities(config, project_root)
732
+ project_language = _resolve_project_language(config)
733
+
734
+ return _generate_one_artifact(
735
+ artifact=artifact,
736
+ project_root=project_root,
737
+ global_conventions=global_conventions,
738
+ depended_by_map=depended_by_map,
739
+ document_node_paths=document_node_paths,
740
+ resolved_ai_command=resolved_ai_command,
741
+ body_max_retries=body_max_retries,
742
+ capabilities=capabilities,
743
+ project_language=project_language,
744
+ feedback=feedback,
745
+ )
746
+
747
+
637
748
  def _enforce_vb_declaration_coherence(
638
749
  project_root: Path,
639
750
  config: dict[str, Any],
@@ -657,8 +657,181 @@ class GreenfieldPipeline:
657
657
  record["units"][key] = STATUS_DONE
658
658
  self._checkpoint(project_root)
659
659
  self.echo(f"[greenfield] generate wave {wave}: {detail}")
660
+
661
+ # After ALL waves are generated, enforce the canonical VB-registry
662
+ # completeness contract (model-independence): a weak model can reference
663
+ # VB ids in acceptance-criteria tables yet declare none in the canonical
664
+ # registry, which honest-REDs only later at implement with a confusing
665
+ # orphan message. Catch it HERE and drive a bounded, canonical-doc-scoped
666
+ # repair so a coherent registry exists before implement — or fail
667
+ # honestly at generate. Runs BEFORE implement by construction.
668
+ self._enforce_generate_vb_registry_gate(project_root, options)
660
669
  record["detail"] = f"{len(waves)} wave(s) generated"
661
670
 
671
+ def _enforce_generate_vb_registry_gate(
672
+ self, project_root: Path, options: dict[str, Any]
673
+ ) -> None:
674
+ """Generate-time canonical VB-registry completeness gate + bounded repair.
675
+
676
+ Adopts the GPT design (B as contract + A as bounded generate repair). On
677
+ error-level :func:`validate_vb_registry_completeness` issues (empty
678
+ canonical registry / unresolved AC references / missing canonical doc),
679
+ re-invoke generation SCOPED TO the canonical VB doc only
680
+ (:func:`codd.generator.regenerate_artifact`) with repair feedback, then
681
+ re-validate. After the bounded attempts (1–2), a still-failing registry
682
+ raises :class:`StageError` (generate honest-RED).
683
+
684
+ The MODEL writes the declarations — this is NOT deterministic auto-derive.
685
+ Acceptance-criteria references are used ONLY as the candidate list in the
686
+ repair feedback, NEVER auto-inserted into the canonical table (rejecting
687
+ design option C). Skipped for a project with no verifiable-behavior
688
+ surface (:func:`project_expects_vb_registry`) and when the owner turned
689
+ the coverage gate off — the registry contract tracks the coverage gate.
690
+ """
691
+ from codd.config import load_project_config
692
+ from codd.verifiable_behavior_audit import (
693
+ _CANONICAL_VB_OUTPUT_PATH,
694
+ coverage_gate_enabled,
695
+ project_expects_vb_registry,
696
+ validate_vb_registry_completeness,
697
+ )
698
+
699
+ if not bool(options.get("coverage_gate", True)):
700
+ return
701
+ try:
702
+ config = load_project_config(project_root)
703
+ except (FileNotFoundError, ValueError):
704
+ config = {}
705
+ if not coverage_gate_enabled(config):
706
+ return
707
+ if not project_expects_vb_registry(project_root, config):
708
+ # No VB surface planned/declared — nothing to certify. Mirrors the
709
+ # brownfield "nothing to audit -> pass" rule; a minimal greenfield
710
+ # project with only design docs is not forced to invent behaviors.
711
+ return
712
+
713
+ max_attempts = max(1, int(self._option_overrides.get("max_repair_attempts") or 0) or 2)
714
+ max_attempts = min(max_attempts, 2) # bounded: 1–2 attempts (design)
715
+
716
+ # Reference the seam through the module (not a bound name) so a test's
717
+ # monkeypatch on ``codd.generator.regenerate_artifact`` is honored.
718
+ from codd import generator as generator_module
719
+
720
+ issues = validate_vb_registry_completeness(project_root, config, strict=True)
721
+ errors = [issue for issue in issues if issue.severity == "error"]
722
+ attempt = 0
723
+ while errors and attempt < max_attempts:
724
+ attempt += 1
725
+ feedback = self._build_vb_registry_repair_feedback(project_root, config, errors)
726
+ self.echo(
727
+ f"[greenfield] generate VB-registry gate: {len(errors)} issue(s); "
728
+ f"re-generating {_CANONICAL_VB_OUTPUT_PATH} with repair feedback "
729
+ f"(attempt {attempt}/{max_attempts})"
730
+ )
731
+ try:
732
+ generator_module.regenerate_artifact(
733
+ project_root,
734
+ output_path=_CANONICAL_VB_OUTPUT_PATH,
735
+ feedback=feedback,
736
+ ai_command=self.ai_command,
737
+ )
738
+ except (FileNotFoundError, ValueError) as exc:
739
+ # The canonical doc is not a planned artifact, or regeneration
740
+ # failed — cannot repair. Fail honestly with the original gap.
741
+ raise StageError(
742
+ f"generate VB-registry gate: canonical registry repair could not run "
743
+ f"({exc}); the canonical VB document ({_CANONICAL_VB_OUTPUT_PATH}) must "
744
+ "declare every verifiable behavior as a first-column VB-* row."
745
+ ) from exc
746
+ issues = validate_vb_registry_completeness(project_root, config, strict=True)
747
+ errors = [issue for issue in issues if issue.severity == "error"]
748
+
749
+ if errors:
750
+ detail = "\n".join(f" - {issue.message}" for issue in errors)
751
+ raise StageError(
752
+ "generate VB-registry gate FAILED: the generated canonical verifiable-behavior "
753
+ f"registry ({_CANONICAL_VB_OUTPUT_PATH}) is still incomplete after "
754
+ f"{attempt} repair attempt(s):\n{detail}\n"
755
+ "Declare every real verifiable behavior exactly once as a first-column VB-* row "
756
+ "in the canonical doc so coverage/authenticity can certify the system."
757
+ )
758
+ if attempt:
759
+ self.echo(
760
+ f"[greenfield] generate VB-registry gate: canonical registry repaired "
761
+ f"after {attempt} attempt(s) — OK"
762
+ )
763
+
764
+ def _build_vb_registry_repair_feedback(
765
+ self, project_root: Path, config: dict[str, Any], errors: list[Any]
766
+ ) -> str:
767
+ """Repair feedback for the canonical-doc-scoped regeneration.
768
+
769
+ Lists the canonical-registry declaration count + the unresolved AC
770
+ references (the CANDIDATE id list, never auto-inserted) + the repair
771
+ rules in the shape the GPT design specified. The references are a hint
772
+ about which behaviors likely exist — the model decides which correspond
773
+ to real behaviors and declares them; nothing is derived deterministically.
774
+ """
775
+ from codd.verifiable_behavior_audit import (
776
+ _CANONICAL_VB_OUTPUT_PATH,
777
+ _config_without_doc_pin,
778
+ _iter_doc_texts,
779
+ _normalize_vb_id,
780
+ is_canonical_vb_doc,
781
+ parse_vb_references,
782
+ parse_vb_table,
783
+ )
784
+
785
+ # Scan the WHOLE test-doc tree (not just test_coverage.docs) so the
786
+ # candidate-reference list mirrors what validate_vb_registry_completeness
787
+ # saw (an AC doc that references VB ids is not in test_coverage.docs).
788
+ doc_texts = _iter_doc_texts(project_root, config=_config_without_doc_pin(config))
789
+ canonical_count = 0
790
+ declared: set[str] = set()
791
+ for doc, text in doc_texts:
792
+ if not is_canonical_vb_doc(output_path=doc):
793
+ continue
794
+ rows = parse_vb_table(text, source_doc=doc)
795
+ canonical_count += len(rows)
796
+ declared.update(_normalize_vb_id(row.vb_id) for row in rows)
797
+
798
+ # Collect unresolved references (id -> the docs that reference it) as the
799
+ # CANDIDATE list only — never auto-inserted into the canonical table.
800
+ candidates: dict[str, set[str]] = {}
801
+ for doc, text in doc_texts:
802
+ if is_canonical_vb_doc(output_path=doc):
803
+ continue
804
+ for ref in parse_vb_references(text, source_doc=doc):
805
+ if _normalize_vb_id(ref.vb_id) in declared:
806
+ continue
807
+ candidates.setdefault(ref.vb_id, set()).add(doc)
808
+
809
+ lines = [
810
+ "The generated verifiable-behavior (VB) registry is incomplete.",
811
+ "",
812
+ "Canonical registry:",
813
+ f"- {_CANONICAL_VB_OUTPUT_PATH} declares {canonical_count} canonical VB-* row(s).",
814
+ ]
815
+ if candidates:
816
+ lines.append("")
817
+ lines.append("Unresolved VB references (candidate ids — NOT yet declared canonically):")
818
+ for vb_id in sorted(candidates):
819
+ docs = ", ".join(sorted(candidates[vb_id]))
820
+ lines.append(f"- {vb_id} (referenced in {docs})")
821
+ lines.extend(
822
+ [
823
+ "",
824
+ "Repair rules:",
825
+ f"- Rewrite ONLY {_CANONICAL_VB_OUTPUT_PATH}.",
826
+ "- Declare every real verifiable behavior exactly once as a first-column VB-* row.",
827
+ "- Use a referenced id only when it corresponds to a real behavior derived from "
828
+ "the requirements/design; fix a reference elsewhere only if its id is genuinely wrong.",
829
+ "- Do NOT add or modify `codd: covers` markers.",
830
+ "- Do NOT edit source or executable tests.",
831
+ ]
832
+ )
833
+ return "\n".join(lines)
834
+
662
835
  # ── stage: implement ────────────────────────────────────
663
836
 
664
837
  def _stage_implement(self, project_root: Path, record: dict[str, Any], options: dict[str, Any]) -> None:
@@ -2522,6 +2695,7 @@ def _enforce_stage_coverage_gate(
2522
2695
  coverage_gate_enabled,
2523
2696
  coverage_gate_max_retries,
2524
2697
  format_gap_feedback,
2698
+ project_expects_vb_registry,
2525
2699
  run_implement_coverage_gate,
2526
2700
  )
2527
2701
 
@@ -2536,6 +2710,24 @@ def _enforce_stage_coverage_gate(
2536
2710
  if not coverage_gate_enabled(config):
2537
2711
  return
2538
2712
 
2713
+ # GREENFIELD-ONLY empty-registry hard-fail (rear guard behind the generate
2714
+ # gate). For a project that is EXPECTED to own a canonical VB registry (it
2715
+ # plans/declares one — see project_expects_vb_registry), an empty audit means
2716
+ # NO verifiable behaviors were declared, so orphan never fires and the
2717
+ # marker-authenticity gate has nothing to judge — verify could pass over a
2718
+ # build whose VB-coverage contract was never generated. Fail honestly here.
2719
+ # This does NOT change the brownfield run_implement_coverage_gate
2720
+ # "nothing to audit -> pass" rule (that path is untouched); it gates ONLY the
2721
+ # greenfield autopilot, and ONLY when a VB surface was expected — a minimal
2722
+ # greenfield project with no VB surface still passes.
2723
+ if project_expects_vb_registry(project_root, config):
2724
+ if not build_vb_coverage_audit(project_root, config=config).rows:
2725
+ raise StageError(
2726
+ "greenfield requires a non-empty canonical VB registry in "
2727
+ "docs/test/test_strategy.md; no verifiable behaviors were declared, "
2728
+ "so coverage/authenticity cannot certify the generated system."
2729
+ )
2730
+
2539
2731
  # Pass the configured test dirs as the audited output paths so the gate
2540
2732
  # treats this as a test-related run (it is — every test the build will ever
2541
2733
  # have now exists) and evaluates the FULL project VB universe in one pass.
@@ -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