codd-dev 2.92.0__tar.gz → 2.93.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 (624) hide show
  1. {codd_dev-2.92.0 → codd_dev-2.93.0}/PKG-INFO +1 -1
  2. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/__init__.py +1 -1
  3. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/cli.py +22 -0
  4. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/greenfield/pipeline.py +59 -0
  5. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/stack/compose.py +53 -6
  6. codd_dev-2.93.0/codd/stack/obligations.py +171 -0
  7. codd_dev-2.93.0/codd/stack/project.py +252 -0
  8. {codd_dev-2.92.0 → codd_dev-2.93.0}/pyproject.toml +1 -1
  9. codd_dev-2.92.0/codd/stack/obligations.py +0 -76
  10. codd_dev-2.92.0/codd/stack/project.py +0 -112
  11. {codd_dev-2.92.0 → codd_dev-2.93.0}/.gitignore +0 -0
  12. {codd_dev-2.92.0 → codd_dev-2.93.0}/LICENSE +0 -0
  13. {codd_dev-2.92.0 → codd_dev-2.93.0}/README.md +0 -0
  14. {codd_dev-2.92.0 → codd_dev-2.93.0}/bench_fixture/README.md +0 -0
  15. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/__main__.py +0 -0
  16. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/_git_helper.py +0 -0
  17. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/action_outcome.py +0 -0
  18. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/ai_invoke.py +0 -0
  19. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/ai_patch.py +0 -0
  20. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/artifact_contract.py +0 -0
  21. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/artifact_ids.py +0 -0
  22. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/artifacts/catalog.yaml +0 -0
  23. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/ask_user_question_adapter.py +0 -0
  24. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/assembler.py +0 -0
  25. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/bridge.py +0 -0
  26. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/brownfield/__init__.py +0 -0
  27. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/brownfield/pipeline.py +0 -0
  28. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/capability_completeness.py +0 -0
  29. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/claude_cli.py +0 -0
  30. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/clustering.py +0 -0
  31. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/coherence_adapters.py +0 -0
  32. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/coherence_engine.py +0 -0
  33. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/confidence.py +0 -0
  34. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/config.py +0 -0
  35. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/config_schema.py +0 -0
  36. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/contracts.py +0 -0
  37. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/contracts_registry/__init__.py +0 -0
  38. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/contracts_registry/__main__.py +0 -0
  39. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/contracts_registry/certify.py +0 -0
  40. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/contracts_registry/generate_matrix.py +0 -0
  41. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/contracts_registry/registry.py +0 -0
  42. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/coverage_auditor.py +0 -0
  43. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/coverage_execution_coherence.py +0 -0
  44. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/coverage_metrics.py +0 -0
  45. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/dag/__init__.py +0 -0
  46. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/dag/auto_repair.py +0 -0
  47. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/dag/builder.py +0 -0
  48. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/dag/checks/__init__.py +0 -0
  49. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/dag/checks/_one_to_many_detection.py +0 -0
  50. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/dag/checks/artifact_contract_check.py +0 -0
  51. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/dag/checks/ci_health.py +0 -0
  52. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/dag/checks/dependency_freshness.py +0 -0
  53. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/dag/checks/depends_on_consistency.py +0 -0
  54. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/dag/checks/deployment_completeness.py +0 -0
  55. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/dag/checks/edge_validity.py +0 -0
  56. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/dag/checks/environment_coverage.py +0 -0
  57. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/dag/checks/implementation_coverage.py +0 -0
  58. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/dag/checks/node_completeness.py +0 -0
  59. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/dag/checks/opt_out.py +0 -0
  60. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/dag/checks/task_completion.py +0 -0
  61. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/dag/checks/transitive_closure.py +0 -0
  62. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/dag/checks/ui_coherence.py +0 -0
  63. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/dag/checks/user_journey_coherence.py +0 -0
  64. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/dag/coverage_axes.py +0 -0
  65. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/dag/defaults/cli.yaml +0 -0
  66. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/dag/defaults/cpp_embedded.yaml +0 -0
  67. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/dag/defaults/csharp.yaml +0 -0
  68. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/dag/defaults/elixir.yaml +0 -0
  69. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/dag/defaults/generic.yaml +0 -0
  70. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/dag/defaults/iot.yaml +0 -0
  71. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/dag/defaults/java.yaml +0 -0
  72. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/dag/defaults/kotlin.yaml +0 -0
  73. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/dag/defaults/mobile.yaml +0 -0
  74. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/dag/defaults/ruby.yaml +0 -0
  75. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/dag/defaults/rust.yaml +0 -0
  76. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/dag/defaults/scala.yaml +0 -0
  77. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/dag/defaults/swift.yaml +0 -0
  78. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/dag/defaults/test_frameworks.yaml +0 -0
  79. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/dag/defaults/web.yaml +0 -0
  80. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/dag/extractor.py +0 -0
  81. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/dag/impact.py +0 -0
  82. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/dag/runner.py +0 -0
  83. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/defaults.py +0 -0
  84. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/defaults.yaml +0 -0
  85. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/dependency_lock_coherence.py +0 -0
  86. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/deploy_targets/__init__.py +0 -0
  87. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/deploy_targets/app_service.py +0 -0
  88. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/deploy_targets/base.py +0 -0
  89. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/deploy_targets/docker_compose.py +0 -0
  90. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/deployer.py +0 -0
  91. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/deployment/__init__.py +0 -0
  92. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/deployment/checks/__init__.py +0 -0
  93. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/deployment/defaults/deploy_targets.yaml +0 -0
  94. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/deployment/defaults/runtime_capability_inference.yaml +0 -0
  95. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/deployment/defaults/schema_providers.yaml +0 -0
  96. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/deployment/defaults/verification_templates.yaml +0 -0
  97. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/deployment/extractor.py +0 -0
  98. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/deployment/providers/__init__.py +0 -0
  99. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/deployment/providers/ai_command.py +0 -0
  100. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/deployment/providers/ai_command_factory.py +0 -0
  101. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/deployment/providers/codex_app_server.py +0 -0
  102. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/deployment/providers/llm_consideration.py +0 -0
  103. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/deployment/providers/schema/__init__.py +0 -0
  104. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/deployment/providers/schema/prisma.py +0 -0
  105. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/deployment/providers/target/__init__.py +0 -0
  106. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/deployment/providers/target/docker_compose.py +0 -0
  107. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/deployment/providers/verification/__init__.py +0 -0
  108. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/deployment/providers/verification/assertion_handlers.py +0 -0
  109. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/deployment/providers/verification/cdp_browser.py +0 -0
  110. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/deployment/providers/verification/cdp_engines.py +0 -0
  111. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/deployment/providers/verification/cdp_launchers.py +0 -0
  112. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/deployment/providers/verification/cdp_wire.py +0 -0
  113. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/deployment/providers/verification/curl.py +0 -0
  114. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/deployment/providers/verification/form_strategies.py +0 -0
  115. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/deployment/providers/verification/means_catalog.py +0 -0
  116. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/deployment/providers/verification/playwright.py +0 -0
  117. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/deployment/providers/verification/pytest_http.py +0 -0
  118. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/deployment/providers/verification/vitest.py +0 -0
  119. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/design_md.py +0 -0
  120. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/diff/__init__.py +0 -0
  121. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/diff/apply.py +0 -0
  122. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/diff/engine.py +0 -0
  123. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/diff/persistence.py +0 -0
  124. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/diff/templates/diff_prompt.md +0 -0
  125. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/discovery.py +0 -0
  126. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/drift.py +0 -0
  127. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/e2e_contract_coherence.py +0 -0
  128. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/e2e_extractor.py +0 -0
  129. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/e2e_generator.py +0 -0
  130. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/e2e_harness.py +0 -0
  131. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/e2e_runner.py +0 -0
  132. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/elicit/__init__.py +0 -0
  133. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/elicit/apply.py +0 -0
  134. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/elicit/engine.py +0 -0
  135. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/elicit/finding.py +0 -0
  136. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/elicit/formatters/__init__.py +0 -0
  137. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/elicit/formatters/base.py +0 -0
  138. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/elicit/formatters/interactive.py +0 -0
  139. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/elicit/formatters/json_fmt.py +0 -0
  140. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/elicit/formatters/md.py +0 -0
  141. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/elicit/lexicon_loader.py +0 -0
  142. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/elicit/persistence.py +0 -0
  143. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/elicit/templates/elicit_prompt_L0.md +0 -0
  144. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/env_refs.py +0 -0
  145. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/extract_ai.py +0 -0
  146. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/extract_paths.py +0 -0
  147. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/extractor.py +0 -0
  148. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/fix/__init__.py +0 -0
  149. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/fix/candidate_selector.py +0 -0
  150. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/fix/design_updater.py +0 -0
  151. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/fix/impl_propagation.py +0 -0
  152. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/fix/interactive_prompt.py +0 -0
  153. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/fix/phenomenon_fixer.py +0 -0
  154. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/fix/phenomenon_parser.py +0 -0
  155. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/fix/risk_classifier.py +0 -0
  156. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/fix/templates/clarification_question.txt +0 -0
  157. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/fix/templates/design_update.txt +0 -0
  158. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/fix/templates/impl_update.txt +0 -0
  159. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/fix/templates/phenomenon_parse.txt +0 -0
  160. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/fix/templates/risk_assessment.txt +0 -0
  161. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/fix/templates_loader.py +0 -0
  162. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/fixer.py +0 -0
  163. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/fixup_drift.py +0 -0
  164. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/fixup_drift_strategies/__init__.py +0 -0
  165. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/fixup_drift_strategies/design_token_drift.py +0 -0
  166. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/fixup_drift_strategies/lexicon_violation.py +0 -0
  167. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/fixup_drift_strategies/url_drift.py +0 -0
  168. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/frontmatter.py +0 -0
  169. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/generator.py +0 -0
  170. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/git_evidence.py +0 -0
  171. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/graph.py +0 -0
  172. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/greenfield/__init__.py +0 -0
  173. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/hitl_session.py +0 -0
  174. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/hooks/__init__.py +0 -0
  175. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/hooks/pre-commit +0 -0
  176. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/hooks/recipes/claude_requirements_nudge.json +0 -0
  177. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/hooks/recipes/claude_settings_example.json +0 -0
  178. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/hooks/recipes/codex_hook.sh +0 -0
  179. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/hooks/recipes/git_post_commit.sh +0 -0
  180. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/hooks/recipes/git_pre_commit.sh +0 -0
  181. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/iac_nfr.py +0 -0
  182. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/implement_oracle.py +0 -0
  183. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/implement_oracle_scope.py +0 -0
  184. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/implement_oracle_types.py +0 -0
  185. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/implementer/__init__.py +0 -0
  186. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/implementer/chunked_runner.py +0 -0
  187. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/implementer/typecheck_loop.py +0 -0
  188. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/implementer.py +0 -0
  189. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/import_coherence.py +0 -0
  190. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/inheritance.py +0 -0
  191. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/init/__init__.py +0 -0
  192. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/init/lexicon_suggest.py +0 -0
  193. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/init/llm_lexicon_suggester.py +0 -0
  194. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/init/stack_detector.py +0 -0
  195. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/knowledge_fetcher.py +0 -0
  196. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/languages/__init__.py +0 -0
  197. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/languages/adapters/__init__.py +0 -0
  198. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/languages/adapters/implement_oracle.py +0 -0
  199. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/languages/adapters/oracle_go.py +0 -0
  200. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/languages/adapters/oracle_python.py +0 -0
  201. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/languages/adapters/oracle_typescript.py +0 -0
  202. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/languages/adapters/runner_report.py +0 -0
  203. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/languages/builtin_adapters.py +0 -0
  204. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/languages/compat.py +0 -0
  205. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/languages/contract.py +0 -0
  206. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/languages/loader.py +0 -0
  207. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/languages/oracle_executor.py +0 -0
  208. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/languages/path_planner.py +0 -0
  209. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/languages/profile.py +0 -0
  210. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/languages/profiles/go.yaml +0 -0
  211. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/languages/profiles/python.yaml +0 -0
  212. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/languages/profiles/typescript.yaml +0 -0
  213. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/languages/registry.py +0 -0
  214. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/languages/verify_executor.py +0 -0
  215. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/languages/verify_plan.py +0 -0
  216. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/lexicon.py +0 -0
  217. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/lexicon_cli/__init__.py +0 -0
  218. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/lexicon_cli/formatters/__init__.py +0 -0
  219. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/lexicon_cli/formatters/html.py +0 -0
  220. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/lexicon_cli/formatters/json_fmt.py +0 -0
  221. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/lexicon_cli/formatters/md.py +0 -0
  222. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/lexicon_cli/inspector.py +0 -0
  223. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/lexicon_cli/manager.py +0 -0
  224. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/lexicon_cli/reporter.py +0 -0
  225. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/lexicon_cli/threshold.py +0 -0
  226. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/llm/__init__.py +0 -0
  227. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/llm/approval.py +0 -0
  228. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/llm/best_practice_augmenter.py +0 -0
  229. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/llm/criteria_expander.py +0 -0
  230. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/llm/design_doc_extractor.py +0 -0
  231. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/llm/impl_step_deriver.py +0 -0
  232. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/llm/means_catalog_loader.py +0 -0
  233. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/llm/parser.py +0 -0
  234. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/llm/plan_deriver.py +0 -0
  235. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/llm/prompt_builder.py +0 -0
  236. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/llm/strategy_validator.py +0 -0
  237. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/llm/templates/best_practice_augment_meta.md +0 -0
  238. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/llm/templates/criteria_expand_meta.md +0 -0
  239. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/llm/templates/design_doc_extract_meta.md +0 -0
  240. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/llm/templates/impl_step_derive_meta.md +0 -0
  241. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/llm/templates/implementation_step_catalog.yaml +0 -0
  242. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/llm/templates/meta_instruction.md +0 -0
  243. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/llm/templates/plan_derive_meta.md +0 -0
  244. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/llm/templates/verification_means_catalog.yaml +0 -0
  245. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/mcp_server.py +0 -0
  246. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/measure.py +0 -0
  247. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/operational_e2e_audit.py +0 -0
  248. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/operations_derive.py +0 -0
  249. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/parsing/__init__.py +0 -0
  250. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/parsing/_shared.py +0 -0
  251. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/parsing/api_specs.py +0 -0
  252. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/parsing/extractor_registry.py +0 -0
  253. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/parsing/filesystem_routes.py +0 -0
  254. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/parsing/iac.py +0 -0
  255. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/parsing/python_ast.py +0 -0
  256. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/parsing/regex_strategies.py +0 -0
  257. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/parsing/schemas.py +0 -0
  258. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/parsing/tests_builddeps.py +0 -0
  259. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/parsing/treesitter.py +0 -0
  260. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/planner.py +0 -0
  261. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/policy.py +0 -0
  262. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/preflight/__init__.py +0 -0
  263. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/preflight/defaults/cli.yaml +0 -0
  264. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/preflight/defaults/generic.yaml +0 -0
  265. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/preflight/defaults/iot.yaml +0 -0
  266. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/preflight/defaults/mobile.yaml +0 -0
  267. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/preflight/defaults/web.yaml +0 -0
  268. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/project_types.py +0 -0
  269. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/propagate.py +0 -0
  270. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/propagation_common.py +0 -0
  271. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/propagator.py +0 -0
  272. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/reconciliation_ledger.py +0 -0
  273. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/reference_resolution.py +0 -0
  274. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/registry.py +0 -0
  275. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/repair/__init__.py +0 -0
  276. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/repair/approval_repair.py +0 -0
  277. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/repair/auto_scope_guard.py +0 -0
  278. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/repair/engine.py +0 -0
  279. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/repair/git_patcher.py +0 -0
  280. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/repair/history.py +0 -0
  281. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/repair/llm_repair_engine.py +0 -0
  282. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/repair/loop.py +0 -0
  283. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/repair/primary_picker.py +0 -0
  284. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/repair/proof_breaks.py +0 -0
  285. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/repair/repair_result.py +0 -0
  286. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/repair/repairability_classifier.py +0 -0
  287. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/repair/schema.py +0 -0
  288. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/repair/templates/analyze_meta.md +0 -0
  289. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/repair/templates/propose_meta.md +0 -0
  290. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/repair/templates/repair_strategy_meta.md +0 -0
  291. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/repair/templates/repairability_meta.md +0 -0
  292. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/repair/test_failure_attribution.py +0 -0
  293. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/repair/verify_runner.py +0 -0
  294. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/repair_slice.py +0 -0
  295. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/require.py +0 -0
  296. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/require_plugins.py +0 -0
  297. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/require_propagate.py +0 -0
  298. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/required_artifacts/defaults/cli.yaml +0 -0
  299. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/required_artifacts/defaults/generic.yaml +0 -0
  300. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/required_artifacts/defaults/iot.yaml +0 -0
  301. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/required_artifacts/defaults/mobile.yaml +0 -0
  302. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/required_artifacts/defaults/web.yaml +0 -0
  303. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/required_artifacts_deriver.py +0 -0
  304. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/requirement_completeness/defaults/cli.yaml +0 -0
  305. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/requirement_completeness/defaults/generic.yaml +0 -0
  306. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/requirement_completeness/defaults/iot.yaml +0 -0
  307. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/requirement_completeness/defaults/mobile.yaml +0 -0
  308. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/requirement_completeness/defaults/web.yaml +0 -0
  309. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/requirement_completeness_auditor.py +0 -0
  310. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/requirement_reconciliation.py +0 -0
  311. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/requirements_meta.py +0 -0
  312. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/restoration_report.py +0 -0
  313. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/restore.py +0 -0
  314. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/routes_extractor.py +0 -0
  315. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/runtime_smoke/__init__.py +0 -0
  316. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/runtime_smoke/checks.py +0 -0
  317. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/runtime_smoke/config.py +0 -0
  318. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/runtime_smoke/report.py +0 -0
  319. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/runtime_smoke/runner.py +0 -0
  320. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/scanner.py +0 -0
  321. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/schema_refs.py +0 -0
  322. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/screen_flow_validator.py +0 -0
  323. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/screen_transition_extractor.py +0 -0
  324. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/screen_transitions/defaults.yaml +0 -0
  325. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/skills_cli/__init__.py +0 -0
  326. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/skills_cli/discovery.py +0 -0
  327. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/skills_cli/manager.py +0 -0
  328. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/skills_cli/paths.py +0 -0
  329. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/stack/__init__.py +0 -0
  330. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/stack/adapters/__init__.py +0 -0
  331. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/stack/adapters/_base.py +0 -0
  332. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/stack/adapters/nextjs.py +0 -0
  333. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/stack/adapters/playwright.py +0 -0
  334. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/stack/command_authenticity.py +0 -0
  335. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/stack/command_plan.py +0 -0
  336. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/stack/loader.py +0 -0
  337. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/stack/lock.py +0 -0
  338. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/stack/profile.py +0 -0
  339. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/stack/profiles/addons/playwright.yaml +0 -0
  340. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/stack/profiles/addons/prisma.yaml +0 -0
  341. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/stack/profiles/frameworks/nextjs.yaml +0 -0
  342. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/stack/registry.py +0 -0
  343. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/stack/resolve.py +0 -0
  344. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/surface_reconciliation.py +0 -0
  345. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/synth.py +0 -0
  346. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/templates/codd.yaml.tmpl +0 -0
  347. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/templates/conventions.yaml.tmpl +0 -0
  348. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/templates/data_dependencies.yaml.tmpl +0 -0
  349. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/templates/doc_links.yaml.tmpl +0 -0
  350. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/templates/extract_ai_prompt_baseline.md +0 -0
  351. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/templates/extracted/api-contract.md.j2 +0 -0
  352. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/templates/extracted/architecture-overview.md.j2 +0 -0
  353. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/templates/extracted/module-detail.md.j2 +0 -0
  354. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/templates/extracted/schema-design.md.j2 +0 -0
  355. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/templates/extracted/system-context.md.j2 +0 -0
  356. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/templates/gitignore.tmpl +0 -0
  357. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/templates/lexicon_questions.md +0 -0
  358. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/templates/lexicon_schema.yaml +0 -0
  359. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/templates/overrides.yaml.tmpl +0 -0
  360. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/test_detection.py +0 -0
  361. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/test_import_coherence.py +0 -0
  362. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/traceability.py +0 -0
  363. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/validator.py +0 -0
  364. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/vb_marker_authenticity.py +0 -0
  365. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/vb_rerun_scope.py +0 -0
  366. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/verifiable_behavior_audit.py +0 -0
  367. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/watch/__init__.py +0 -0
  368. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/watch/events.py +0 -0
  369. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/watch/propagation_log.py +0 -0
  370. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/watch/propagation_pipeline.py +0 -0
  371. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/watch/test_runner.py +0 -0
  372. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/watch/watcher.py +0 -0
  373. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/wiring.py +0 -0
  374. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ai_governance_eu_act/coverage_matrix.md +0 -0
  375. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ai_governance_eu_act/elicit_extend.md +0 -0
  376. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ai_governance_eu_act/lexicon.yaml +0 -0
  377. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ai_governance_eu_act/manifest.yaml +0 -0
  378. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ai_governance_eu_act/recommended_kinds.yaml +0 -0
  379. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ai_governance_eu_act/severity_rules.yaml +0 -0
  380. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/api_rate_limiting_caching/coverage_matrix.md +0 -0
  381. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/api_rate_limiting_caching/elicit_extend.md +0 -0
  382. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/api_rate_limiting_caching/lexicon.yaml +0 -0
  383. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/api_rate_limiting_caching/manifest.yaml +0 -0
  384. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/api_rate_limiting_caching/recommended_kinds.yaml +0 -0
  385. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/api_rate_limiting_caching/severity_rules.yaml +0 -0
  386. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/api_rest_openapi/coverage_matrix.md +0 -0
  387. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/api_rest_openapi/elicit_extend.md +0 -0
  388. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/api_rest_openapi/lexicon.yaml +0 -0
  389. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/api_rest_openapi/manifest.yaml +0 -0
  390. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/api_rest_openapi/recommended_kinds.yaml +0 -0
  391. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/api_rest_openapi/severity_rules.yaml +0 -0
  392. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/babok/elicit_extend.md +0 -0
  393. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/babok/lexicon.yaml +0 -0
  394. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/babok/manifest.yaml +0 -0
  395. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/babok/recommended_kinds.yaml +0 -0
  396. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/babok/severity_rules.yaml +0 -0
  397. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/backend_event_cloudevents/coverage_matrix.md +0 -0
  398. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/backend_event_cloudevents/elicit_extend.md +0 -0
  399. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/backend_event_cloudevents/lexicon.yaml +0 -0
  400. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/backend_event_cloudevents/manifest.yaml +0 -0
  401. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/backend_event_cloudevents/recommended_kinds.yaml +0 -0
  402. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/backend_event_cloudevents/severity_rules.yaml +0 -0
  403. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/backend_graphql/coverage_matrix.md +0 -0
  404. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/backend_graphql/elicit_extend.md +0 -0
  405. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/backend_graphql/lexicon.yaml +0 -0
  406. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/backend_graphql/manifest.yaml +0 -0
  407. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/backend_graphql/recommended_kinds.yaml +0 -0
  408. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/backend_graphql/severity_rules.yaml +0 -0
  409. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/backend_grpc_proto/coverage_matrix.md +0 -0
  410. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/backend_grpc_proto/elicit_extend.md +0 -0
  411. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/backend_grpc_proto/lexicon.yaml +0 -0
  412. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/backend_grpc_proto/manifest.yaml +0 -0
  413. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/backend_grpc_proto/recommended_kinds.yaml +0 -0
  414. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/backend_grpc_proto/severity_rules.yaml +0 -0
  415. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/compliance_hipaa/coverage_matrix.md +0 -0
  416. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/compliance_hipaa/elicit_extend.md +0 -0
  417. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/compliance_hipaa/lexicon.yaml +0 -0
  418. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/compliance_hipaa/manifest.yaml +0 -0
  419. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/compliance_hipaa/recommended_kinds.yaml +0 -0
  420. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/compliance_hipaa/severity_rules.yaml +0 -0
  421. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/compliance_iso27001/coverage_matrix.md +0 -0
  422. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/compliance_iso27001/elicit_extend.md +0 -0
  423. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/compliance_iso27001/lexicon.yaml +0 -0
  424. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/compliance_iso27001/manifest.yaml +0 -0
  425. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/compliance_iso27001/recommended_kinds.yaml +0 -0
  426. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/compliance_iso27001/severity_rules.yaml +0 -0
  427. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/compliance_pci_dss_4/coverage_matrix.md +0 -0
  428. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/compliance_pci_dss_4/elicit_extend.md +0 -0
  429. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/compliance_pci_dss_4/lexicon.yaml +0 -0
  430. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/compliance_pci_dss_4/manifest.yaml +0 -0
  431. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/compliance_pci_dss_4/recommended_kinds.yaml +0 -0
  432. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/compliance_pci_dss_4/severity_rules.yaml +0 -0
  433. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/data_aggregation_policies/coverage_matrix.md +0 -0
  434. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/data_aggregation_policies/elicit_extend.md +0 -0
  435. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/data_aggregation_policies/lexicon.yaml +0 -0
  436. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/data_aggregation_policies/manifest.yaml +0 -0
  437. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/data_aggregation_policies/recommended_kinds.yaml +0 -0
  438. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/data_aggregation_policies/severity_rules.yaml +0 -0
  439. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/coverage_matrix.md +0 -0
  440. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/elicit_extend.md +0 -0
  441. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/lexicon.yaml +0 -0
  442. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/manifest.yaml +0 -0
  443. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/recommended_kinds.yaml +0 -0
  444. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/severity_rules.yaml +0 -0
  445. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/data_governance_appi_gdpr/coverage_matrix.md +0 -0
  446. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/data_governance_appi_gdpr/elicit_extend.md +0 -0
  447. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/data_governance_appi_gdpr/lexicon.yaml +0 -0
  448. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/data_governance_appi_gdpr/manifest.yaml +0 -0
  449. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/data_governance_appi_gdpr/recommended_kinds.yaml +0 -0
  450. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/data_governance_appi_gdpr/severity_rules.yaml +0 -0
  451. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/data_nosql_jsonschema/coverage_matrix.md +0 -0
  452. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/data_nosql_jsonschema/elicit_extend.md +0 -0
  453. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/data_nosql_jsonschema/lexicon.yaml +0 -0
  454. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/data_nosql_jsonschema/manifest.yaml +0 -0
  455. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/data_nosql_jsonschema/recommended_kinds.yaml +0 -0
  456. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/data_nosql_jsonschema/severity_rules.yaml +0 -0
  457. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/data_relational_iso_sql/coverage_matrix.md +0 -0
  458. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/data_relational_iso_sql/elicit_extend.md +0 -0
  459. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/data_relational_iso_sql/lexicon.yaml +0 -0
  460. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/data_relational_iso_sql/manifest.yaml +0 -0
  461. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/data_relational_iso_sql/recommended_kinds.yaml +0 -0
  462. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/data_relational_iso_sql/severity_rules.yaml +0 -0
  463. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ddd_domain_driven_design/coverage_matrix.md +0 -0
  464. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ddd_domain_driven_design/elicit_extend.md +0 -0
  465. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ddd_domain_driven_design/lexicon.yaml +0 -0
  466. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ddd_domain_driven_design/manifest.yaml +0 -0
  467. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ddd_domain_driven_design/recommended_kinds.yaml +0 -0
  468. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ddd_domain_driven_design/severity_rules.yaml +0 -0
  469. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/dora_sre_metrics/coverage_matrix.md +0 -0
  470. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/dora_sre_metrics/elicit_extend.md +0 -0
  471. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/dora_sre_metrics/lexicon.yaml +0 -0
  472. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/dora_sre_metrics/manifest.yaml +0 -0
  473. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/dora_sre_metrics/recommended_kinds.yaml +0 -0
  474. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/dora_sre_metrics/severity_rules.yaml +0 -0
  475. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/i18n_unicode_cldr/coverage_matrix.md +0 -0
  476. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/i18n_unicode_cldr/elicit_extend.md +0 -0
  477. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/i18n_unicode_cldr/lexicon.yaml +0 -0
  478. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/i18n_unicode_cldr/manifest.yaml +0 -0
  479. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/i18n_unicode_cldr/recommended_kinds.yaml +0 -0
  480. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/i18n_unicode_cldr/severity_rules.yaml +0 -0
  481. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ml_model_cards/coverage_matrix.md +0 -0
  482. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ml_model_cards/elicit_extend.md +0 -0
  483. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ml_model_cards/lexicon.yaml +0 -0
  484. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ml_model_cards/manifest.yaml +0 -0
  485. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ml_model_cards/recommended_kinds.yaml +0 -0
  486. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ml_model_cards/severity_rules.yaml +0 -0
  487. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/mobile_a11y_native/coverage_matrix.md +0 -0
  488. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/mobile_a11y_native/elicit_extend.md +0 -0
  489. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/mobile_a11y_native/lexicon.yaml +0 -0
  490. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/mobile_a11y_native/manifest.yaml +0 -0
  491. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/mobile_a11y_native/recommended_kinds.yaml +0 -0
  492. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/mobile_a11y_native/severity_rules.yaml +0 -0
  493. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/mobile_android_material3/coverage_matrix.md +0 -0
  494. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/mobile_android_material3/elicit_extend.md +0 -0
  495. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/mobile_android_material3/lexicon.yaml +0 -0
  496. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/mobile_android_material3/manifest.yaml +0 -0
  497. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/mobile_android_material3/recommended_kinds.yaml +0 -0
  498. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/mobile_android_material3/severity_rules.yaml +0 -0
  499. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/mobile_ios_hig/coverage_matrix.md +0 -0
  500. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/mobile_ios_hig/elicit_extend.md +0 -0
  501. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/mobile_ios_hig/lexicon.yaml +0 -0
  502. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/mobile_ios_hig/manifest.yaml +0 -0
  503. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/mobile_ios_hig/recommended_kinds.yaml +0 -0
  504. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/mobile_ios_hig/severity_rules.yaml +0 -0
  505. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/mobile_security_masvs/coverage_matrix.md +0 -0
  506. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/mobile_security_masvs/elicit_extend.md +0 -0
  507. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/mobile_security_masvs/lexicon.yaml +0 -0
  508. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/mobile_security_masvs/manifest.yaml +0 -0
  509. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/mobile_security_masvs/recommended_kinds.yaml +0 -0
  510. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/mobile_security_masvs/severity_rules.yaml +0 -0
  511. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ops_cicd_pipeline/coverage_matrix.md +0 -0
  512. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ops_cicd_pipeline/elicit_extend.md +0 -0
  513. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ops_cicd_pipeline/lexicon.yaml +0 -0
  514. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ops_cicd_pipeline/manifest.yaml +0 -0
  515. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ops_cicd_pipeline/recommended_kinds.yaml +0 -0
  516. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ops_cicd_pipeline/severity_rules.yaml +0 -0
  517. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ops_iac_terraform/coverage_matrix.md +0 -0
  518. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ops_iac_terraform/elicit_extend.md +0 -0
  519. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ops_iac_terraform/lexicon.yaml +0 -0
  520. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ops_iac_terraform/manifest.yaml +0 -0
  521. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ops_iac_terraform/recommended_kinds.yaml +0 -0
  522. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ops_iac_terraform/severity_rules.yaml +0 -0
  523. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ops_kubernetes/coverage_matrix.md +0 -0
  524. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ops_kubernetes/elicit_extend.md +0 -0
  525. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ops_kubernetes/lexicon.yaml +0 -0
  526. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ops_kubernetes/manifest.yaml +0 -0
  527. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ops_kubernetes/recommended_kinds.yaml +0 -0
  528. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ops_kubernetes/severity_rules.yaml +0 -0
  529. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ops_observability_otel/coverage_matrix.md +0 -0
  530. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ops_observability_otel/elicit_extend.md +0 -0
  531. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ops_observability_otel/lexicon.yaml +0 -0
  532. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ops_observability_otel/manifest.yaml +0 -0
  533. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ops_observability_otel/recommended_kinds.yaml +0 -0
  534. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ops_observability_otel/severity_rules.yaml +0 -0
  535. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/process_iso25010/coverage_matrix.md +0 -0
  536. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/process_iso25010/elicit_extend.md +0 -0
  537. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/process_iso25010/lexicon.yaml +0 -0
  538. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/process_iso25010/manifest.yaml +0 -0
  539. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/process_iso25010/recommended_kinds.yaml +0 -0
  540. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/process_iso25010/severity_rules.yaml +0 -0
  541. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/process_test_iso29119/coverage_matrix.md +0 -0
  542. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/process_test_iso29119/elicit_extend.md +0 -0
  543. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/process_test_iso29119/lexicon.yaml +0 -0
  544. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/process_test_iso29119/manifest.yaml +0 -0
  545. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/process_test_iso29119/recommended_kinds.yaml +0 -0
  546. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/process_test_iso29119/severity_rules.yaml +0 -0
  547. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/twelve_factor_app/coverage_matrix.md +0 -0
  548. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/twelve_factor_app/elicit_extend.md +0 -0
  549. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/twelve_factor_app/lexicon.yaml +0 -0
  550. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/twelve_factor_app/manifest.yaml +0 -0
  551. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/twelve_factor_app/recommended_kinds.yaml +0 -0
  552. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/twelve_factor_app/severity_rules.yaml +0 -0
  553. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/coverage_matrix.md +0 -0
  554. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/elicit_extend.md +0 -0
  555. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/lexicon.yaml +0 -0
  556. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/manifest.yaml +0 -0
  557. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/recommended_kinds.yaml +0 -0
  558. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/severity_rules.yaml +0 -0
  559. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_authn_webauthn/coverage_matrix.md +0 -0
  560. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_authn_webauthn/elicit_extend.md +0 -0
  561. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_authn_webauthn/lexicon.yaml +0 -0
  562. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_authn_webauthn/manifest.yaml +0 -0
  563. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_authn_webauthn/recommended_kinds.yaml +0 -0
  564. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_authn_webauthn/severity_rules.yaml +0 -0
  565. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_browser_compat/coverage_matrix.md +0 -0
  566. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_browser_compat/elicit_extend.md +0 -0
  567. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_browser_compat/lexicon.yaml +0 -0
  568. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_browser_compat/manifest.yaml +0 -0
  569. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_browser_compat/recommended_kinds.yaml +0 -0
  570. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_browser_compat/severity_rules.yaml +0 -0
  571. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_forms_html5/coverage_matrix.md +0 -0
  572. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_forms_html5/elicit_extend.md +0 -0
  573. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_forms_html5/lexicon.yaml +0 -0
  574. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_forms_html5/manifest.yaml +0 -0
  575. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_forms_html5/recommended_kinds.yaml +0 -0
  576. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_forms_html5/severity_rules.yaml +0 -0
  577. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_performance_core_web_vitals/coverage_matrix.md +0 -0
  578. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_performance_core_web_vitals/elicit_extend.md +0 -0
  579. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_performance_core_web_vitals/lexicon.yaml +0 -0
  580. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_performance_core_web_vitals/manifest.yaml +0 -0
  581. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_performance_core_web_vitals/recommended_kinds.yaml +0 -0
  582. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_performance_core_web_vitals/severity_rules.yaml +0 -0
  583. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_pwa_manifest/coverage_matrix.md +0 -0
  584. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_pwa_manifest/elicit_extend.md +0 -0
  585. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_pwa_manifest/lexicon.yaml +0 -0
  586. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_pwa_manifest/manifest.yaml +0 -0
  587. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_pwa_manifest/recommended_kinds.yaml +0 -0
  588. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_pwa_manifest/severity_rules.yaml +0 -0
  589. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_responsive/coverage_matrix.md +0 -0
  590. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_responsive/elicit_extend.md +0 -0
  591. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_responsive/lexicon.yaml +0 -0
  592. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_responsive/manifest.yaml +0 -0
  593. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_responsive/recommended_kinds.yaml +0 -0
  594. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_responsive/severity_rules.yaml +0 -0
  595. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_security_owasp/coverage_matrix.md +0 -0
  596. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_security_owasp/elicit_extend.md +0 -0
  597. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_security_owasp/lexicon.yaml +0 -0
  598. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_security_owasp/manifest.yaml +0 -0
  599. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_security_owasp/recommended_kinds.yaml +0 -0
  600. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_security_owasp/severity_rules.yaml +0 -0
  601. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_seo_schemaorg/coverage_matrix.md +0 -0
  602. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_seo_schemaorg/elicit_extend.md +0 -0
  603. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_seo_schemaorg/lexicon.yaml +0 -0
  604. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_seo_schemaorg/manifest.yaml +0 -0
  605. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_seo_schemaorg/recommended_kinds.yaml +0 -0
  606. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_seo_schemaorg/severity_rules.yaml +0 -0
  607. {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/stack_map.yaml +0 -0
  608. {codd_dev-2.92.0 → codd_dev-2.93.0}/docs/cookbook/cdp_browser/README.md +0 -0
  609. {codd_dev-2.92.0 → codd_dev-2.93.0}/docs/cookbook/presentation_aggregation/README.md +0 -0
  610. {codd_dev-2.92.0 → codd_dev-2.93.0}/docs/requirements/README.md +0 -0
  611. {codd_dev-2.92.0 → codd_dev-2.93.0}/dogfood/README.md +0 -0
  612. {codd_dev-2.92.0 → codd_dev-2.93.0}/dogfood/fixtures/flat_py_app/README.md +0 -0
  613. {codd_dev-2.92.0 → codd_dev-2.93.0}/examples/README.md +0 -0
  614. {codd_dev-2.92.0 → codd_dev-2.93.0}/skills/codd-assemble/SKILL.md +0 -0
  615. {codd_dev-2.92.0 → codd_dev-2.93.0}/skills/codd-evolve/SKILL.md +0 -0
  616. {codd_dev-2.92.0 → codd_dev-2.93.0}/skills/codd-generate/SKILL.md +0 -0
  617. {codd_dev-2.92.0 → codd_dev-2.93.0}/skills/codd-greenfield/SKILL.md +0 -0
  618. {codd_dev-2.92.0 → codd_dev-2.93.0}/skills/codd-impact/SKILL.md +0 -0
  619. {codd_dev-2.92.0 → codd_dev-2.93.0}/skills/codd-init/SKILL.md +0 -0
  620. {codd_dev-2.92.0 → codd_dev-2.93.0}/skills/codd-propagate/SKILL.md +0 -0
  621. {codd_dev-2.92.0 → codd_dev-2.93.0}/skills/codd-restore/SKILL.md +0 -0
  622. {codd_dev-2.92.0 → codd_dev-2.93.0}/skills/codd-scan/SKILL.md +0 -0
  623. {codd_dev-2.92.0 → codd_dev-2.93.0}/skills/codd-validate/SKILL.md +0 -0
  624. {codd_dev-2.92.0 → codd_dev-2.93.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.92.0
3
+ Version: 2.93.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.92.0"
3
+ __version__ = "2.93.0"
@@ -7697,6 +7697,28 @@ def _intake_stack_contract_for_verify(project_root: Path, *, stack_command_execu
7697
7697
  f"({', '.join(plan.command_ids)})"
7698
7698
  )
7699
7699
 
7700
+ # Stack obligation CHECKER gate (Contract Kernel v2.77e) — the verify-path mirror of
7701
+ # the greenfield pipeline's :meth:`GreenfieldPipeline._enforce_stack_obligations`.
7702
+ # AFTER materialization (v2.77c) + authenticity (v2.77d), CHECK the composed
7703
+ # framework/addon OBLIGATIONS as a red/green gate: the Next.js ignoreBuildErrors guard
7704
+ # reds a build that would pass with type errors; the Playwright e2e_actually_executed
7705
+ # obligation reds a 0-test run. Anti-false-green: a missing/disabled/faulting checker
7706
+ # or an unenforceable ERROR obligation is RED (honest non-zero exit), never a silent
7707
+ # pass. Uses the ALREADY-RESOLVED ``contract`` from intake (no re-resolution from disk
7708
+ # — avoids a TOCTOU skip) and the SAME current-run evidence the authenticity layer
7709
+ # blessed. A non-stack project never reaches here (byte-identical).
7710
+ from codd.stack.project import StackObligationGateError, enforce_stack_obligation_gate
7711
+
7712
+ try:
7713
+ enforce_stack_obligation_gate(contract, project_root)
7714
+ except StackObligationGateError as exc:
7715
+ click.echo(f"[verify] stack obligation gate: {exc}", err=True)
7716
+ raise SystemExit(1) from exc
7717
+ click.echo(
7718
+ f"[verify] stack obligation gate: {len(contract.obligations)} obligation(s) checked "
7719
+ "— all enforced obligations satisfied"
7720
+ )
7721
+
7700
7722
 
7701
7723
  def _run_verify_once(
7702
7724
  path: str,
@@ -533,6 +533,26 @@ class GreenfieldPipeline:
533
533
  {"status": STATUS_PENDING, "detail": ""}, str(exc),
534
534
  )
535
535
 
536
+ # Stack obligation CHECKER gate (Contract Kernel v2.77e) — turn the framework/
537
+ # addon OBLIGATIONS into a red/green gate, AFTER materialization+authenticity. The
538
+ # composed commands now run (v2.77c) and are authentic (v2.77d); this CHECKS the
539
+ # declared obligations (the Next.js ignoreBuildErrors guard reds a build that would
540
+ # pass with type errors; the Playwright e2e_actually_executed obligation reds a
541
+ # 0-test run). Anti-false-green: a missing/disabled/faulting checker or an
542
+ # unenforceable ERROR obligation is RED, never a silent pass. Uses the ALREADY-
543
+ # RESOLVED contract (no re-resolution from disk — avoids a TOCTOU skip) and the
544
+ # SAME current-run evidence the authenticity layer blessed. Only for stack-declared
545
+ # projects (contract is not None) — a non-stack run is byte-identical (no gate).
546
+ # Routed through _fail like intake/lock/materialization.
547
+ try:
548
+ if contract is not None:
549
+ self._enforce_stack_obligations(project_root, session, contract)
550
+ except StageError as exc:
551
+ return self._fail(
552
+ project_root, session, options, "stack_obligations",
553
+ {"status": STATUS_PENDING, "detail": ""}, str(exc),
554
+ )
555
+
536
556
  runners: dict[str, Callable[[Path, dict[str, Any], dict[str, Any]], None]] = {
537
557
  "init": self._stage_init,
538
558
  "elicit": self._stage_elicit,
@@ -756,6 +776,45 @@ class GreenfieldPipeline:
756
776
  f"{len(plan.slots)} slot(s) invoked ({', '.join(plan.command_ids)})"
757
777
  )
758
778
 
779
+ # ── stack obligation checker gate (Contract Kernel v2.77e) ──
780
+
781
+ def _enforce_stack_obligations(self, project_root: Path, session: dict[str, Any], contract) -> None:
782
+ """Run the composed stack obligation checkers as a red/green gate (v2.77e).
783
+
784
+ See the call site in :meth:`run`. Only invoked for stack-declared projects
785
+ (``contract is not None``); non-stack projects never reach here, so they are
786
+ byte-identical (no obligation gate at all).
787
+
788
+ Uses the ALREADY-RESOLVED ``contract`` (passed in from intake/lock/
789
+ materialization) — NOT a re-resolution from disk — so a stack file that changes
790
+ or is deleted after materialization cannot make this gate silently skip (a
791
+ TOCTOU false-green). :func:`enforce_stack_obligation_gate` invokes every
792
+ obligation's registered checker with ``project_root`` plus the current-run
793
+ evidence (the SAME e2e report the authenticity layer blessed), and raises
794
+ :class:`StackObligationGateError` unless every ERROR obligation was genuinely
795
+ enforced AND satisfied: a blocking violation, an unenforced ERROR obligation
796
+ (no registered checker — unverifiable), or a checker fault (raised / None /
797
+ malformed return) is RED. Translated to :class:`StageError` so the autopilot
798
+ reports it honestly via ``_fail``. The per-obligation verdict counts are
799
+ recorded in the run trace (observable, like the lock verdict + command plan).
800
+ """
801
+ from codd.stack.project import StackObligationGateError, enforce_stack_obligation_gate
802
+
803
+ try:
804
+ result = enforce_stack_obligation_gate(contract, project_root)
805
+ except StackObligationGateError as exc:
806
+ self.echo(f"[greenfield] stack obligation gate: {exc}")
807
+ raise StageError(str(exc)) from exc
808
+
809
+ record = session.get("stack_contract")
810
+ if isinstance(record, dict) and result is not None:
811
+ record["stack_obligations_checked"] = len(contract.obligations)
812
+ record["stack_obligations_unenforced"] = [o.id for o in result.unenforced]
813
+ self.echo(
814
+ "[greenfield] stack obligation gate: "
815
+ f"{len(contract.obligations)} obligation(s) checked — all enforced obligations satisfied"
816
+ )
817
+
759
818
  # ── option resolution ───────────────────────────────────
760
819
 
761
820
  def _resolve_options(self, project_root: Path) -> dict[str, Any]:
@@ -50,7 +50,14 @@ VERIFICATION_SLOTS = frozenset(
50
50
  }
51
51
  )
52
52
 
53
- _SEVERITY_RANK = {"warn": 0, "error": 1}
53
+ def _normalize_checker_ref(ref: str | None) -> str:
54
+ """Canonical form of an obligation ``checker`` ref for redefinition comparison.
55
+
56
+ ``None`` / empty / whitespace all normalize to ``""`` (no checker) so a later layer
57
+ that nulls or blanks the checker compares as a CHANGE vs. a non-empty ref (a real
58
+ weakening). Surrounding whitespace is stripped; the ref is otherwise compared
59
+ verbatim (we never claim two distinct refs are "equivalent")."""
60
+ return (ref or "").strip()
54
61
 
55
62
 
56
63
  @dataclass(frozen=True)
@@ -199,7 +206,28 @@ def compose(
199
206
  )
200
207
  )
201
208
 
202
- # -- obligations (union; an addon must not WEAKEN a framework obligation) ---
209
+ # -- obligations (union; a later layer may not silently REDEFINE an obligation) -
210
+ # An obligation id is a SEMANTIC KEY. A later layer may repeat the same id ONLY if
211
+ # the enforcement-relevant fields (severity + checker ref) are IDENTICAL — an exact
212
+ # idempotent duplicate (e.g. two layers asserting the same e2e obligation). ANY
213
+ # enforcement-relevant change is a semantic conflict (Contract Kernel v2.77e,
214
+ # GPT-5.5 Pro consult 2026-06-21):
215
+ #
216
+ # * severity mismatch (downgrade OR upgrade) — first-wins would SILENTLY pick one,
217
+ # hiding the ambiguity. A downgrade weakens; an upgrade silently DROPS a stricter
218
+ # later layer (a false-green relative to the intended stricter obligation). With
219
+ # no explicit monotone-merge semantics, ANY severity mismatch is RED (strict
220
+ # option — less clever, harder to game).
221
+ # * checker-ref change (including a redefinition that nulls/empties or points the
222
+ # checker at a different/weaker/unknown adapter) — "same severity, gutted checker"
223
+ # is real weakening that first-wins hides by luck, not by contract. A later layer
224
+ # that means a DIFFERENT check must use a DIFFERENT id; one that means the SAME
225
+ # check must use the SAME checker ref. (We do NOT try to prove two different refs
226
+ # are "equivalent" — intractable at the contract-kernel level.)
227
+ #
228
+ # first-wins is kept for the resolved set (the FIRST declaration stays authoritative),
229
+ # but a non-idempotent redefinition is RECORDED as a Conflict so the strict gate reds
230
+ # — silence is forbidden (no silent fallback).
203
231
  obligations: list[Obligation] = []
204
232
  obligation_owners: dict[str, str] = {}
205
233
  obl_by_id: dict[str, Obligation] = {}
@@ -211,14 +239,33 @@ def compose(
211
239
  obligation_owners[obl.id] = f"{kind}:{prof.id}"
212
240
  continue
213
241
  existing = obl_by_id[obl.id]
214
- if _SEVERITY_RANK[obl.severity] < _SEVERITY_RANK[existing.severity]:
242
+ if obl.severity != existing.severity:
243
+ conflicts.append(
244
+ Conflict(
245
+ kind="semantic",
246
+ detail=(
247
+ f"obligation {obl.id!r} severity redefined to {obl.severity!r} "
248
+ f"by {kind}:{prof.id} (owner {obligation_owners[obl.id]} "
249
+ f"declared {existing.severity!r}) — a severity mismatch is a "
250
+ "semantic conflict (a downgrade weakens; an upgrade silently "
251
+ "drops a stricter layer); use the same id only for the same "
252
+ "obligation at the same severity"
253
+ ),
254
+ layers=(obligation_owners[obl.id], f"{kind}:{prof.id}"),
255
+ )
256
+ )
257
+ elif _normalize_checker_ref(obl.checker) != _normalize_checker_ref(existing.checker):
215
258
  conflicts.append(
216
259
  Conflict(
217
260
  kind="semantic",
218
261
  detail=(
219
- f"obligation {obl.id!r} weakened to {obl.severity!r} by "
220
- f"{kind}:{prof.id} (owner {obligation_owners[obl.id]} "
221
- f"declared {existing.severity!r})"
262
+ f"obligation {obl.id!r} checker redefined to "
263
+ f"{obl.checker!r} by {kind}:{prof.id} (owner "
264
+ f"{obligation_owners[obl.id]} declared {existing.checker!r})"
265
+ "a same-id checker-ref change is a semantic conflict (it would "
266
+ "silently keep one checker and discard the other); two different "
267
+ "checks need two different obligation ids, the same check needs "
268
+ "the same checker ref"
222
269
  ),
223
270
  layers=(obligation_owners[obl.id], f"{kind}:{prof.id}"),
224
271
  )
@@ -0,0 +1,171 @@
1
+ """Run a resolved stack contract's obligations through their registered checkers.
2
+
3
+ This is the GATE SEAM: greenfield/verify call :func:`enforce_obligations` with a
4
+ :class:`~codd.stack.compose.ResolvedStackContract` and the project context; each
5
+ obligation is dispatched to its registered checker (design §3 obligations). An
6
+ ERROR-severity obligation with findings is gate-blocking; a WARN one is advisory.
7
+
8
+ Anti-false-green (cardinal rule): a checker that is *not real enforcement* must
9
+ NEVER be read as "satisfied". Two distinct failure modes are surfaced, both
10
+ gate-blocking for an ERROR obligation (Contract Kernel v2.77e):
11
+
12
+ * ``unenforced`` — the obligation declares a checker ref that resolves to NOTHING
13
+ (missing ref / null / unregistered / a registry entry that is not callable). The
14
+ enforcement does not exist; an ERROR release-blocker with no checker is a failure,
15
+ never a silent pass.
16
+ * ``faults`` — the checker EXISTS but did not produce a usable verdict: it raised,
17
+ returned ``None`` (the canonical ``checker(...) or []`` false-green this layer
18
+ fixes — an unimplemented checker that falls off the end returns ``None``, which
19
+ must NOT collapse to "no findings"), or returned a non-list malformed value. The
20
+ obligation could not be honestly judged → RED for an ERROR obligation.
21
+
22
+ A WARN obligation that is unenforced or faults is advisory (does not block) — but is
23
+ still reported so the run record is honest. The conformance contract
24
+ (``tests/test_stack_obligations.py``) keeps the curated profiles' ERROR obligations
25
+ enforceable; a runtime caller must still surface these honestly.
26
+ """
27
+
28
+ from __future__ import annotations
29
+
30
+ from dataclasses import dataclass
31
+
32
+ from .adapters import resolve_checker
33
+ from .adapters._base import ObligationFinding
34
+ from .compose import ResolvedStackContract
35
+ from .profile import Obligation
36
+
37
+
38
+ @dataclass(frozen=True)
39
+ class ObligationViolation:
40
+ obligation: Obligation
41
+ finding: ObligationFinding
42
+
43
+ @property
44
+ def blocking(self) -> bool:
45
+ return self.obligation.severity == "error"
46
+
47
+
48
+ @dataclass(frozen=True)
49
+ class ObligationFault:
50
+ """A checker that EXISTS but produced no usable verdict (raised / None / malformed).
51
+
52
+ Distinct from a :class:`ObligationViolation` (the checker ran and found a real
53
+ violation) and from ``unenforced`` (no checker at all): here the checker was
54
+ invoked but could not be honestly read as "satisfied". For an ERROR obligation
55
+ this is RED — the obligation could not be enforced (anti-false-green: never treat
56
+ a broken checker as a pass).
57
+ """
58
+
59
+ obligation: Obligation
60
+ reason: str
61
+
62
+ @property
63
+ def blocking(self) -> bool:
64
+ return self.obligation.severity == "error"
65
+
66
+
67
+ @dataclass(frozen=True)
68
+ class ObligationResult:
69
+ violations: tuple[ObligationViolation, ...]
70
+ unenforced: tuple[Obligation, ...]
71
+ faults: tuple[ObligationFault, ...] = ()
72
+
73
+ @property
74
+ def blocking_violations(self) -> tuple[ObligationViolation, ...]:
75
+ return tuple(v for v in self.violations if v.blocking)
76
+
77
+ @property
78
+ def blocking_faults(self) -> tuple[ObligationFault, ...]:
79
+ return tuple(f for f in self.faults if f.blocking)
80
+
81
+ @property
82
+ def passed(self) -> bool:
83
+ """Gate verdict: GREEN only when every ERROR obligation was genuinely
84
+ enforced AND satisfied. RED on ANY of: a blocking violation; an unenforced
85
+ ERROR obligation (no checker — claimed enforcement that does not run); a
86
+ blocking fault (the checker exists but raised / returned None / returned a
87
+ malformed value — the obligation could not be honestly judged). All three are
88
+ anti-false-green: a release-blocker that was not really checked is never green."""
89
+ if self.blocking_violations:
90
+ return False
91
+ if self.blocking_faults:
92
+ return False
93
+ return not any(o.severity == "error" for o in self.unenforced)
94
+
95
+
96
+ def enforce_obligations(
97
+ contract: ResolvedStackContract,
98
+ *,
99
+ project_root=None,
100
+ **checker_inputs,
101
+ ) -> ObligationResult:
102
+ """Dispatch each obligation to its registered checker and collect the result.
103
+
104
+ ``checker_inputs`` (e.g. ``report_data=...`` / ``report_path=...``) are passed
105
+ through to every checker; each checker takes ``**kwargs`` and uses what it
106
+ needs (the Next.js guard reads ``project_root``; the Playwright guard reads
107
+ the report).
108
+
109
+ Hardened seam (v2.77e): a registered checker is invoked defensively. It must
110
+ return a ``list`` of findings (an empty list == SATISFIED). A checker that
111
+ raises, returns ``None``, or returns a non-list is recorded as an
112
+ :class:`ObligationFault` (NOT silently treated as satisfied) — the ``or []``
113
+ coercion that turned an unimplemented (``None``-returning) checker into a false
114
+ green is removed. A registry entry that is not callable is treated as
115
+ ``unenforced`` (no usable checker exists).
116
+ """
117
+ violations: list[ObligationViolation] = []
118
+ unenforced: list[Obligation] = []
119
+ faults: list[ObligationFault] = []
120
+ for obl in contract.obligations:
121
+ checker = resolve_checker(obl.checker)
122
+ if checker is None:
123
+ unenforced.append(obl)
124
+ continue
125
+ if not callable(checker):
126
+ # A registry entry that is not callable cannot enforce anything — there is
127
+ # no usable checker, so this is "unenforced", not a fault (same verdict for
128
+ # an ERROR obligation: RED).
129
+ unenforced.append(obl)
130
+ continue
131
+ try:
132
+ findings = checker(project_root=project_root, **checker_inputs)
133
+ except Exception as exc: # noqa: BLE001 — a crashing checker is NOT "satisfied".
134
+ faults.append(
135
+ ObligationFault(
136
+ obligation=obl,
137
+ reason=f"checker {obl.checker!r} raised {type(exc).__name__}: {exc}",
138
+ )
139
+ )
140
+ continue
141
+ if findings is None:
142
+ faults.append(
143
+ ObligationFault(
144
+ obligation=obl,
145
+ reason=(
146
+ f"checker {obl.checker!r} returned None (no verdict) — an "
147
+ "unimplemented or fall-through checker is not a satisfied "
148
+ "obligation (anti-false-green: never coerce None to no-findings)"
149
+ ),
150
+ )
151
+ )
152
+ continue
153
+ if not isinstance(findings, list):
154
+ faults.append(
155
+ ObligationFault(
156
+ obligation=obl,
157
+ reason=(
158
+ f"checker {obl.checker!r} returned a non-list "
159
+ f"{type(findings).__name__} — a checker must return a list of "
160
+ "findings (empty == satisfied); a malformed return is not a pass"
161
+ ),
162
+ )
163
+ )
164
+ continue
165
+ for finding in findings:
166
+ violations.append(ObligationViolation(obligation=obl, finding=finding))
167
+ return ObligationResult(
168
+ violations=tuple(violations),
169
+ unenforced=tuple(unenforced),
170
+ faults=tuple(faults),
171
+ )
@@ -0,0 +1,252 @@
1
+ """Project-level wiring seam: resolve + enforce a project's declared stack.
2
+
3
+ This is the bridge the greenfield/verify pipeline calls. A project opts into the
4
+ framework layer by declaring a ``stack:`` block in its codd.yaml (design §1)::
5
+
6
+ stack:
7
+ language: typescript
8
+ frameworks: [nextjs]
9
+ addons: [prisma, playwright]
10
+
11
+ * :func:`resolve_project_stack` reads that block and returns the
12
+ ResolvedStackContract — or ``None`` if the project declares no stack (the
13
+ framework layer is OPT-IN; a project without a ``stack:`` block is completely
14
+ unaffected, so Python/Go/plain-TS projects see no behaviour change).
15
+ * :func:`verify_project_stack` resolves then runs the obligation checkers,
16
+ returning the gate result (or ``None`` for a no-stack project).
17
+
18
+ The pipeline call-site reds on ``result is not None and not result.passed``.
19
+ """
20
+
21
+ from __future__ import annotations
22
+
23
+ from pathlib import Path
24
+ from typing import Any, Mapping
25
+
26
+ from .compose import ResolvedStackContract
27
+ from .obligations import ObligationResult, enforce_obligations
28
+ from .resolve import resolve_stack_from_declaration
29
+
30
+
31
+ def _read_stack_declaration(project_root: str | Path) -> Mapping[str, Any] | None:
32
+ """Return the ``stack:`` block from the project's codd.yaml, or ``None``."""
33
+ from codd.config import load_project_config
34
+
35
+ try:
36
+ config = load_project_config(Path(project_root))
37
+ except (FileNotFoundError, ValueError):
38
+ return None
39
+ decl = config.get("stack")
40
+ if not decl or not isinstance(decl, Mapping):
41
+ return None
42
+ return decl
43
+
44
+
45
+ def resolve_project_stack(project_root: str | Path) -> ResolvedStackContract | None:
46
+ """Resolve a project's declared stack into a contract, or ``None`` if none.
47
+
48
+ ``None`` means "this project does not use the framework layer" — never an
49
+ error (the framework layer is opt-in).
50
+ """
51
+ decl = _read_stack_declaration(project_root)
52
+ if decl is None:
53
+ return None
54
+ return resolve_stack_from_declaration(decl)
55
+
56
+
57
+ def verify_project_stack(
58
+ project_root: str | Path, **checker_inputs: Any
59
+ ) -> ObligationResult | None:
60
+ """Resolve + enforce a project's stack obligations (the framework verify gate).
61
+
62
+ Returns ``None`` for a project that declares no stack (no-op gate); otherwise
63
+ the :class:`ObligationResult` (``result.passed`` is the gate verdict;
64
+ ``checker_inputs`` such as ``report_data=`` / ``report_path=`` are forwarded
65
+ to the checkers).
66
+ """
67
+ contract = resolve_project_stack(project_root)
68
+ if contract is None:
69
+ return None
70
+ return enforce_obligations(contract, project_root=project_root, **checker_inputs)
71
+
72
+
73
+ class StackObligationGateError(RuntimeError):
74
+ """The stack obligation-checker gate failed (Contract Kernel v2.77e).
75
+
76
+ Raised by :func:`enforce_stack_obligation_gate` when the resolved stack
77
+ contract's obligations are not all genuinely-enforced-and-satisfied
78
+ (:attr:`ObligationResult.passed` is False): a blocking violation, an unenforced
79
+ ERROR obligation (no registered checker), or a blocking fault (a checker that
80
+ raised / returned None / returned a malformed value). The call-sites translate
81
+ it to their context's RED — ``StageError`` in the greenfield pipeline (→
82
+ ``_fail``), ``SystemExit`` non-zero on the verify CLI path — exactly like
83
+ :class:`codd.stack.command_plan.StackCommandMaterializationError` and
84
+ :class:`codd.stack.command_authenticity.StackCommandAuthenticityError`.
85
+ """
86
+
87
+
88
+ def build_obligation_checker_inputs(
89
+ contract: ResolvedStackContract,
90
+ project_root: str | Path,
91
+ ) -> dict[str, Any]:
92
+ """Assemble the obligation checkers' runtime inputs from CURRENT-RUN evidence.
93
+
94
+ Contract Kernel v2.77e. Most obligation checkers (e.g. the Next.js
95
+ ``ignoreBuildErrors`` guard) read only the filesystem (``project_root``) and need
96
+ no extra input — the gate always passes ``project_root`` to every checker. The
97
+ one curated obligation that needs runtime evidence is the Playwright
98
+ ``e2e_actually_executed`` check, which must see THIS run's e2e report.
99
+
100
+ The evidence is consumed from the SAME source the v2.77c/d materialization +
101
+ authenticity layer blessed — NOT re-derived or re-parsed with a divergent parser
102
+ (GPT-5.5 Pro consult 2026-06-21: prefer the authenticity-normalized
103
+ ``report_data`` to avoid parser drift / TOCTOU). For each TEST-report slot in the
104
+ composed command plan, the slot's current-run report is parsed by the canonical
105
+ ``runner_report`` adapter (the exact parser v2.77d uses) into normalized counts,
106
+ which are shaped into the ``report_data`` the obligation checker reads. Because
107
+ both layers use the canonical ``suites`` parser, a 0-test / fully-skipped e2e run
108
+ reds in BOTH (defense in depth on ONE evidence source, never two parsers).
109
+
110
+ Binding rule (anti-false-green): the report is passed ONLY when the current-run
111
+ evidence was genuinely produced AND readable this run (a stale file the executor
112
+ did not produce this run is NOT trusted → no report passed → a checker that needs
113
+ it reds on "missing report", which is the correct RED). If the plan has more than
114
+ one TEST-report slot the binding is AMBIGUOUS for a single ``report_data`` kwarg;
115
+ the curated stack has exactly one (Playwright ``e2e_test``), so this is a clean
116
+ single binding today — a future multi-e2e stack must disambiguate (left to the
117
+ step that introduces it; until then a second TEST-report slot is surfaced as an
118
+ error so it can never silently pick the wrong report).
119
+ """
120
+ from codd.stack.command_authenticity import (
121
+ StackCommandObservationKind,
122
+ observe_stack_command_report,
123
+ resolve_stack_command_observation_policy,
124
+ )
125
+ from codd.stack.command_plan import stack_command_plan
126
+
127
+ root = Path(project_root)
128
+ plan = stack_command_plan(contract) # conflict gate already passed upstream; pure projection
129
+
130
+ test_report_obs: list[Any] = []
131
+ for slot in plan.slots:
132
+ policy = resolve_stack_command_observation_policy(
133
+ slot.slot_id, contract_policies=contract.command_observation_policies
134
+ )
135
+ if policy is None or policy.kind is not StackCommandObservationKind.TEST_REPORT:
136
+ continue
137
+ if not (slot.report_capture or slot.report_path):
138
+ continue
139
+ obs = observe_stack_command_report(slot, root, policy)
140
+ test_report_obs.append((slot, obs))
141
+
142
+ if not test_report_obs:
143
+ return {}
144
+ if len(test_report_obs) > 1:
145
+ slots = ", ".join(f"{s.slot_id}({s.owner})" for s, _ in test_report_obs)
146
+ raise StackObligationGateError(
147
+ "ambiguous obligation evidence: the resolved stack has more than one "
148
+ f"TEST-report command slot ({slots}); a single report binding cannot pick "
149
+ "one unambiguously (anti-false-green: never last-writer-wins across reports). "
150
+ "A multi-e2e stack must declare per-obligation evidence binding."
151
+ )
152
+
153
+ slot, obs = test_report_obs[0]
154
+ if not (obs.produced and obs.readable):
155
+ # The current-run evidence was NOT produced/readable this run — do NOT pass a
156
+ # stale or absent report. A checker that requires it then reds on "missing
157
+ # report" (the correct RED); we never feed it untrusted evidence.
158
+ return {}
159
+
160
+ # Shape the canonical-normalized counts into the report_data the obligation checker
161
+ # reads. ``expected`` = clean passes; ``unexpected``/``flaky`` = 0 so the checker's
162
+ # "executed = expected+unexpected+flaky" equals the canonical clean-pass count: a
163
+ # run with >=1 clean pass is GREEN; a fully-skipped/all-failed run (passed_cases==0)
164
+ # is RED — agreeing with the canonical parser, no divergent stats read of the file.
165
+ passed = int(obs.passed_cases or 0)
166
+ report_data = {"stats": {"expected": passed, "unexpected": 0, "flaky": 0, "skipped": 0}}
167
+ return {"report_data": report_data}
168
+
169
+
170
+ def enforce_stack_obligation_gate(
171
+ contract: ResolvedStackContract | None,
172
+ project_root: str | Path,
173
+ ) -> ObligationResult | None:
174
+ """The Contract Kernel v2.77e GATE: run the stack obligation checkers, RED on failure.
175
+
176
+ Wired AFTER v2.77c materialization + v2.77d authenticity. Takes the ALREADY-RESOLVED
177
+ contract (NO re-resolution from disk — avoids the TOCTOU hole where a stack file
178
+ changes/deletes between materialization and this gate and the obligation gate then
179
+ silently skips). For ``contract is None`` (a project that declared no stack) it is a
180
+ no-op → ``None`` (byte-identical, no gate). Otherwise it invokes every obligation's
181
+ registered checker with ``project_root`` plus the current-run evidence
182
+ (:func:`build_obligation_checker_inputs`) and raises :class:`StackObligationGateError`
183
+ unless :attr:`ObligationResult.passed` (every ERROR obligation genuinely enforced and
184
+ satisfied; an unenforced ERROR obligation, a blocking violation, or a checker fault is
185
+ RED). Returns the :class:`ObligationResult` on GREEN so the caller can record it.
186
+ """
187
+ if contract is None:
188
+ return None
189
+ checker_inputs = build_obligation_checker_inputs(contract, project_root)
190
+ result = enforce_obligations(contract, project_root=Path(project_root), **checker_inputs)
191
+ if not result.passed:
192
+ reasons: list[str] = []
193
+ for v in result.blocking_violations:
194
+ reasons.append(f"[violation] {v.obligation.id}: {v.finding.detail}")
195
+ for f in result.blocking_faults:
196
+ reasons.append(f"[fault] {f.obligation.id}: {f.reason}")
197
+ for o in result.unenforced:
198
+ if o.severity == "error":
199
+ reasons.append(
200
+ f"[unenforced] {o.id}: no registered checker for ref {o.checker!r} "
201
+ "(an ERROR obligation with no checker is unverifiable — RED)"
202
+ )
203
+ raise StackObligationGateError(
204
+ f"stack obligation gate failed ({contract.stack_id}): "
205
+ + "; ".join(reasons)
206
+ + ". A framework/addon obligation was not genuinely enforced AND satisfied — "
207
+ "anti-false-green: a missing/disabled/faulting checker or a violated obligation "
208
+ "is RED, never a silent pass (Contract Kernel v2.77e)."
209
+ )
210
+ return result
211
+
212
+
213
+ def stack_contract_trace(contract: ResolvedStackContract) -> dict[str, Any]:
214
+ """Run-trace fields proving a run consumed the resolved stack contract.
215
+
216
+ Mirrors :meth:`codd.languages.contract.ResolvedLanguageContract.to_trace`: the
217
+ minimal, deterministic facts a run record / trace records so the live-consumption
218
+ of the framework-stack contract is observable (the v2.77a intake exit gate).
219
+ ``stack_contract_hash`` is the deterministic :attr:`ResolvedStackContract.content_hash`;
220
+ ``resolved_stack_id`` / ``resolved_stack_layers`` make "changing the profile changes
221
+ the plan" visible in the record itself.
222
+ """
223
+ return {
224
+ "resolved_stack_id": contract.stack_id,
225
+ "stack_contract_hash": contract.content_hash,
226
+ "resolved_stack_layers": [f"{ref.kind}:{ref.id}" for ref in contract.layers],
227
+ }
228
+
229
+
230
+ def stack_contract_intake(project_root: str | Path) -> ResolvedStackContract | None:
231
+ """Resolve a project's declared stack contract for LIVE consumption (intake only).
232
+
233
+ This is the production seam the greenfield/verify pipeline calls EARLY in a run
234
+ to bring the (previously dormant) framework-stack contract into the live run —
235
+ *without* enforcing any obligation yet (enforcement is v2.77b-e). It is exactly
236
+ :func:`resolve_project_stack`, named for the intake call-site so the
237
+ "no non-test caller = 0 state" is eliminated by an unambiguous production caller.
238
+
239
+ Contract:
240
+
241
+ * No ``stack:`` block (the opt-in framework layer is unused) → ``None``. The
242
+ vast majority of projects; behaviour is byte-identical, never an error.
243
+ * A declared ``stack:`` block → the :class:`ResolvedStackContract` (its
244
+ ``content_hash`` is the run-trace hash; see :func:`stack_contract_trace`).
245
+ * A declared-but-BROKEN block (unknown language/framework/addon, malformed
246
+ mapping) → the resolver RAISES (``ValueError`` / ``UnknownLanguageError`` /
247
+ ``UnknownLayerError``). The intake NEVER swallows this: anti-false-green
248
+ forbids a declared-but-unresolvable stack from silently proceeding as if no
249
+ stack were declared. The pipeline call-site turns the raise into an honest
250
+ stage/command failure.
251
+ """
252
+ return resolve_project_stack(project_root)
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "codd-dev"
7
- version = "2.92.0"
7
+ version = "2.93.0"
8
8
  description = "CoDD: Coherence-Driven Development — cross-artifact change impact analysis"
9
9
  readme = "README.md"
10
10
  license = "MIT"