codd-dev 2.90.0__tar.gz → 2.91.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 (621) hide show
  1. {codd_dev-2.90.0 → codd_dev-2.91.0}/PKG-INFO +1 -1
  2. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/__init__.py +1 -1
  3. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/cli.py +34 -1
  4. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/greenfield/pipeline.py +80 -0
  5. codd_dev-2.91.0/codd/stack/command_plan.py +385 -0
  6. {codd_dev-2.90.0 → codd_dev-2.91.0}/pyproject.toml +1 -1
  7. {codd_dev-2.90.0 → codd_dev-2.91.0}/.gitignore +0 -0
  8. {codd_dev-2.90.0 → codd_dev-2.91.0}/LICENSE +0 -0
  9. {codd_dev-2.90.0 → codd_dev-2.91.0}/README.md +0 -0
  10. {codd_dev-2.90.0 → codd_dev-2.91.0}/bench_fixture/README.md +0 -0
  11. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/__main__.py +0 -0
  12. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/_git_helper.py +0 -0
  13. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/action_outcome.py +0 -0
  14. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/ai_invoke.py +0 -0
  15. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/ai_patch.py +0 -0
  16. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/artifact_contract.py +0 -0
  17. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/artifact_ids.py +0 -0
  18. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/artifacts/catalog.yaml +0 -0
  19. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/ask_user_question_adapter.py +0 -0
  20. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/assembler.py +0 -0
  21. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/bridge.py +0 -0
  22. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/brownfield/__init__.py +0 -0
  23. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/brownfield/pipeline.py +0 -0
  24. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/capability_completeness.py +0 -0
  25. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/claude_cli.py +0 -0
  26. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/clustering.py +0 -0
  27. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/coherence_adapters.py +0 -0
  28. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/coherence_engine.py +0 -0
  29. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/confidence.py +0 -0
  30. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/config.py +0 -0
  31. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/config_schema.py +0 -0
  32. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/contracts.py +0 -0
  33. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/contracts_registry/__init__.py +0 -0
  34. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/contracts_registry/__main__.py +0 -0
  35. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/contracts_registry/certify.py +0 -0
  36. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/contracts_registry/generate_matrix.py +0 -0
  37. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/contracts_registry/registry.py +0 -0
  38. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/coverage_auditor.py +0 -0
  39. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/coverage_execution_coherence.py +0 -0
  40. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/coverage_metrics.py +0 -0
  41. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/dag/__init__.py +0 -0
  42. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/dag/auto_repair.py +0 -0
  43. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/dag/builder.py +0 -0
  44. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/dag/checks/__init__.py +0 -0
  45. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/dag/checks/_one_to_many_detection.py +0 -0
  46. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/dag/checks/artifact_contract_check.py +0 -0
  47. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/dag/checks/ci_health.py +0 -0
  48. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/dag/checks/dependency_freshness.py +0 -0
  49. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/dag/checks/depends_on_consistency.py +0 -0
  50. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/dag/checks/deployment_completeness.py +0 -0
  51. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/dag/checks/edge_validity.py +0 -0
  52. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/dag/checks/environment_coverage.py +0 -0
  53. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/dag/checks/implementation_coverage.py +0 -0
  54. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/dag/checks/node_completeness.py +0 -0
  55. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/dag/checks/opt_out.py +0 -0
  56. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/dag/checks/task_completion.py +0 -0
  57. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/dag/checks/transitive_closure.py +0 -0
  58. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/dag/checks/ui_coherence.py +0 -0
  59. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/dag/checks/user_journey_coherence.py +0 -0
  60. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/dag/coverage_axes.py +0 -0
  61. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/dag/defaults/cli.yaml +0 -0
  62. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/dag/defaults/cpp_embedded.yaml +0 -0
  63. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/dag/defaults/csharp.yaml +0 -0
  64. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/dag/defaults/elixir.yaml +0 -0
  65. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/dag/defaults/generic.yaml +0 -0
  66. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/dag/defaults/iot.yaml +0 -0
  67. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/dag/defaults/java.yaml +0 -0
  68. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/dag/defaults/kotlin.yaml +0 -0
  69. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/dag/defaults/mobile.yaml +0 -0
  70. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/dag/defaults/ruby.yaml +0 -0
  71. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/dag/defaults/rust.yaml +0 -0
  72. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/dag/defaults/scala.yaml +0 -0
  73. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/dag/defaults/swift.yaml +0 -0
  74. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/dag/defaults/test_frameworks.yaml +0 -0
  75. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/dag/defaults/web.yaml +0 -0
  76. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/dag/extractor.py +0 -0
  77. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/dag/impact.py +0 -0
  78. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/dag/runner.py +0 -0
  79. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/defaults.py +0 -0
  80. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/defaults.yaml +0 -0
  81. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/dependency_lock_coherence.py +0 -0
  82. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/deploy_targets/__init__.py +0 -0
  83. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/deploy_targets/app_service.py +0 -0
  84. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/deploy_targets/base.py +0 -0
  85. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/deploy_targets/docker_compose.py +0 -0
  86. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/deployer.py +0 -0
  87. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/deployment/__init__.py +0 -0
  88. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/deployment/checks/__init__.py +0 -0
  89. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/deployment/defaults/deploy_targets.yaml +0 -0
  90. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/deployment/defaults/runtime_capability_inference.yaml +0 -0
  91. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/deployment/defaults/schema_providers.yaml +0 -0
  92. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/deployment/defaults/verification_templates.yaml +0 -0
  93. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/deployment/extractor.py +0 -0
  94. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/deployment/providers/__init__.py +0 -0
  95. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/deployment/providers/ai_command.py +0 -0
  96. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/deployment/providers/ai_command_factory.py +0 -0
  97. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/deployment/providers/codex_app_server.py +0 -0
  98. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/deployment/providers/llm_consideration.py +0 -0
  99. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/deployment/providers/schema/__init__.py +0 -0
  100. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/deployment/providers/schema/prisma.py +0 -0
  101. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/deployment/providers/target/__init__.py +0 -0
  102. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/deployment/providers/target/docker_compose.py +0 -0
  103. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/deployment/providers/verification/__init__.py +0 -0
  104. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/deployment/providers/verification/assertion_handlers.py +0 -0
  105. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/deployment/providers/verification/cdp_browser.py +0 -0
  106. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/deployment/providers/verification/cdp_engines.py +0 -0
  107. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/deployment/providers/verification/cdp_launchers.py +0 -0
  108. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/deployment/providers/verification/cdp_wire.py +0 -0
  109. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/deployment/providers/verification/curl.py +0 -0
  110. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/deployment/providers/verification/form_strategies.py +0 -0
  111. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/deployment/providers/verification/means_catalog.py +0 -0
  112. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/deployment/providers/verification/playwright.py +0 -0
  113. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/deployment/providers/verification/pytest_http.py +0 -0
  114. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/deployment/providers/verification/vitest.py +0 -0
  115. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/design_md.py +0 -0
  116. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/diff/__init__.py +0 -0
  117. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/diff/apply.py +0 -0
  118. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/diff/engine.py +0 -0
  119. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/diff/persistence.py +0 -0
  120. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/diff/templates/diff_prompt.md +0 -0
  121. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/discovery.py +0 -0
  122. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/drift.py +0 -0
  123. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/e2e_contract_coherence.py +0 -0
  124. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/e2e_extractor.py +0 -0
  125. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/e2e_generator.py +0 -0
  126. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/e2e_harness.py +0 -0
  127. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/e2e_runner.py +0 -0
  128. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/elicit/__init__.py +0 -0
  129. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/elicit/apply.py +0 -0
  130. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/elicit/engine.py +0 -0
  131. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/elicit/finding.py +0 -0
  132. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/elicit/formatters/__init__.py +0 -0
  133. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/elicit/formatters/base.py +0 -0
  134. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/elicit/formatters/interactive.py +0 -0
  135. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/elicit/formatters/json_fmt.py +0 -0
  136. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/elicit/formatters/md.py +0 -0
  137. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/elicit/lexicon_loader.py +0 -0
  138. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/elicit/persistence.py +0 -0
  139. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/elicit/templates/elicit_prompt_L0.md +0 -0
  140. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/env_refs.py +0 -0
  141. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/extract_ai.py +0 -0
  142. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/extract_paths.py +0 -0
  143. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/extractor.py +0 -0
  144. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/fix/__init__.py +0 -0
  145. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/fix/candidate_selector.py +0 -0
  146. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/fix/design_updater.py +0 -0
  147. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/fix/impl_propagation.py +0 -0
  148. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/fix/interactive_prompt.py +0 -0
  149. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/fix/phenomenon_fixer.py +0 -0
  150. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/fix/phenomenon_parser.py +0 -0
  151. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/fix/risk_classifier.py +0 -0
  152. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/fix/templates/clarification_question.txt +0 -0
  153. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/fix/templates/design_update.txt +0 -0
  154. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/fix/templates/impl_update.txt +0 -0
  155. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/fix/templates/phenomenon_parse.txt +0 -0
  156. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/fix/templates/risk_assessment.txt +0 -0
  157. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/fix/templates_loader.py +0 -0
  158. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/fixer.py +0 -0
  159. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/fixup_drift.py +0 -0
  160. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/fixup_drift_strategies/__init__.py +0 -0
  161. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/fixup_drift_strategies/design_token_drift.py +0 -0
  162. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/fixup_drift_strategies/lexicon_violation.py +0 -0
  163. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/fixup_drift_strategies/url_drift.py +0 -0
  164. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/frontmatter.py +0 -0
  165. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/generator.py +0 -0
  166. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/git_evidence.py +0 -0
  167. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/graph.py +0 -0
  168. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/greenfield/__init__.py +0 -0
  169. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/hitl_session.py +0 -0
  170. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/hooks/__init__.py +0 -0
  171. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/hooks/pre-commit +0 -0
  172. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/hooks/recipes/claude_requirements_nudge.json +0 -0
  173. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/hooks/recipes/claude_settings_example.json +0 -0
  174. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/hooks/recipes/codex_hook.sh +0 -0
  175. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/hooks/recipes/git_post_commit.sh +0 -0
  176. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/hooks/recipes/git_pre_commit.sh +0 -0
  177. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/iac_nfr.py +0 -0
  178. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/implement_oracle.py +0 -0
  179. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/implement_oracle_scope.py +0 -0
  180. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/implement_oracle_types.py +0 -0
  181. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/implementer/__init__.py +0 -0
  182. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/implementer/chunked_runner.py +0 -0
  183. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/implementer/typecheck_loop.py +0 -0
  184. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/implementer.py +0 -0
  185. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/import_coherence.py +0 -0
  186. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/inheritance.py +0 -0
  187. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/init/__init__.py +0 -0
  188. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/init/lexicon_suggest.py +0 -0
  189. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/init/llm_lexicon_suggester.py +0 -0
  190. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/init/stack_detector.py +0 -0
  191. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/knowledge_fetcher.py +0 -0
  192. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/languages/__init__.py +0 -0
  193. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/languages/adapters/__init__.py +0 -0
  194. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/languages/adapters/implement_oracle.py +0 -0
  195. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/languages/adapters/oracle_go.py +0 -0
  196. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/languages/adapters/oracle_python.py +0 -0
  197. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/languages/adapters/oracle_typescript.py +0 -0
  198. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/languages/adapters/runner_report.py +0 -0
  199. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/languages/builtin_adapters.py +0 -0
  200. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/languages/compat.py +0 -0
  201. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/languages/contract.py +0 -0
  202. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/languages/loader.py +0 -0
  203. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/languages/oracle_executor.py +0 -0
  204. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/languages/path_planner.py +0 -0
  205. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/languages/profile.py +0 -0
  206. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/languages/profiles/go.yaml +0 -0
  207. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/languages/profiles/python.yaml +0 -0
  208. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/languages/profiles/typescript.yaml +0 -0
  209. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/languages/registry.py +0 -0
  210. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/languages/verify_executor.py +0 -0
  211. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/languages/verify_plan.py +0 -0
  212. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/lexicon.py +0 -0
  213. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/lexicon_cli/__init__.py +0 -0
  214. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/lexicon_cli/formatters/__init__.py +0 -0
  215. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/lexicon_cli/formatters/html.py +0 -0
  216. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/lexicon_cli/formatters/json_fmt.py +0 -0
  217. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/lexicon_cli/formatters/md.py +0 -0
  218. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/lexicon_cli/inspector.py +0 -0
  219. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/lexicon_cli/manager.py +0 -0
  220. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/lexicon_cli/reporter.py +0 -0
  221. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/lexicon_cli/threshold.py +0 -0
  222. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/llm/__init__.py +0 -0
  223. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/llm/approval.py +0 -0
  224. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/llm/best_practice_augmenter.py +0 -0
  225. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/llm/criteria_expander.py +0 -0
  226. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/llm/design_doc_extractor.py +0 -0
  227. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/llm/impl_step_deriver.py +0 -0
  228. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/llm/means_catalog_loader.py +0 -0
  229. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/llm/parser.py +0 -0
  230. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/llm/plan_deriver.py +0 -0
  231. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/llm/prompt_builder.py +0 -0
  232. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/llm/strategy_validator.py +0 -0
  233. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/llm/templates/best_practice_augment_meta.md +0 -0
  234. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/llm/templates/criteria_expand_meta.md +0 -0
  235. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/llm/templates/design_doc_extract_meta.md +0 -0
  236. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/llm/templates/impl_step_derive_meta.md +0 -0
  237. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/llm/templates/implementation_step_catalog.yaml +0 -0
  238. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/llm/templates/meta_instruction.md +0 -0
  239. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/llm/templates/plan_derive_meta.md +0 -0
  240. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/llm/templates/verification_means_catalog.yaml +0 -0
  241. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/mcp_server.py +0 -0
  242. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/measure.py +0 -0
  243. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/operational_e2e_audit.py +0 -0
  244. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/operations_derive.py +0 -0
  245. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/parsing/__init__.py +0 -0
  246. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/parsing/_shared.py +0 -0
  247. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/parsing/api_specs.py +0 -0
  248. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/parsing/extractor_registry.py +0 -0
  249. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/parsing/filesystem_routes.py +0 -0
  250. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/parsing/iac.py +0 -0
  251. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/parsing/python_ast.py +0 -0
  252. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/parsing/regex_strategies.py +0 -0
  253. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/parsing/schemas.py +0 -0
  254. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/parsing/tests_builddeps.py +0 -0
  255. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/parsing/treesitter.py +0 -0
  256. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/planner.py +0 -0
  257. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/policy.py +0 -0
  258. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/preflight/__init__.py +0 -0
  259. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/preflight/defaults/cli.yaml +0 -0
  260. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/preflight/defaults/generic.yaml +0 -0
  261. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/preflight/defaults/iot.yaml +0 -0
  262. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/preflight/defaults/mobile.yaml +0 -0
  263. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/preflight/defaults/web.yaml +0 -0
  264. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/project_types.py +0 -0
  265. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/propagate.py +0 -0
  266. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/propagation_common.py +0 -0
  267. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/propagator.py +0 -0
  268. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/reconciliation_ledger.py +0 -0
  269. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/reference_resolution.py +0 -0
  270. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/registry.py +0 -0
  271. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/repair/__init__.py +0 -0
  272. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/repair/approval_repair.py +0 -0
  273. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/repair/auto_scope_guard.py +0 -0
  274. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/repair/engine.py +0 -0
  275. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/repair/git_patcher.py +0 -0
  276. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/repair/history.py +0 -0
  277. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/repair/llm_repair_engine.py +0 -0
  278. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/repair/loop.py +0 -0
  279. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/repair/primary_picker.py +0 -0
  280. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/repair/proof_breaks.py +0 -0
  281. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/repair/repair_result.py +0 -0
  282. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/repair/repairability_classifier.py +0 -0
  283. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/repair/schema.py +0 -0
  284. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/repair/templates/analyze_meta.md +0 -0
  285. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/repair/templates/propose_meta.md +0 -0
  286. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/repair/templates/repair_strategy_meta.md +0 -0
  287. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/repair/templates/repairability_meta.md +0 -0
  288. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/repair/test_failure_attribution.py +0 -0
  289. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/repair/verify_runner.py +0 -0
  290. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/repair_slice.py +0 -0
  291. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/require.py +0 -0
  292. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/require_plugins.py +0 -0
  293. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/require_propagate.py +0 -0
  294. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/required_artifacts/defaults/cli.yaml +0 -0
  295. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/required_artifacts/defaults/generic.yaml +0 -0
  296. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/required_artifacts/defaults/iot.yaml +0 -0
  297. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/required_artifacts/defaults/mobile.yaml +0 -0
  298. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/required_artifacts/defaults/web.yaml +0 -0
  299. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/required_artifacts_deriver.py +0 -0
  300. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/requirement_completeness/defaults/cli.yaml +0 -0
  301. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/requirement_completeness/defaults/generic.yaml +0 -0
  302. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/requirement_completeness/defaults/iot.yaml +0 -0
  303. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/requirement_completeness/defaults/mobile.yaml +0 -0
  304. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/requirement_completeness/defaults/web.yaml +0 -0
  305. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/requirement_completeness_auditor.py +0 -0
  306. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/requirement_reconciliation.py +0 -0
  307. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/requirements_meta.py +0 -0
  308. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/restoration_report.py +0 -0
  309. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/restore.py +0 -0
  310. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/routes_extractor.py +0 -0
  311. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/runtime_smoke/__init__.py +0 -0
  312. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/runtime_smoke/checks.py +0 -0
  313. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/runtime_smoke/config.py +0 -0
  314. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/runtime_smoke/report.py +0 -0
  315. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/runtime_smoke/runner.py +0 -0
  316. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/scanner.py +0 -0
  317. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/schema_refs.py +0 -0
  318. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/screen_flow_validator.py +0 -0
  319. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/screen_transition_extractor.py +0 -0
  320. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/screen_transitions/defaults.yaml +0 -0
  321. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/skills_cli/__init__.py +0 -0
  322. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/skills_cli/discovery.py +0 -0
  323. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/skills_cli/manager.py +0 -0
  324. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/skills_cli/paths.py +0 -0
  325. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/stack/__init__.py +0 -0
  326. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/stack/adapters/__init__.py +0 -0
  327. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/stack/adapters/_base.py +0 -0
  328. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/stack/adapters/nextjs.py +0 -0
  329. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/stack/adapters/playwright.py +0 -0
  330. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/stack/compose.py +0 -0
  331. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/stack/loader.py +0 -0
  332. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/stack/lock.py +0 -0
  333. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/stack/obligations.py +0 -0
  334. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/stack/profile.py +0 -0
  335. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/stack/profiles/addons/playwright.yaml +0 -0
  336. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/stack/profiles/addons/prisma.yaml +0 -0
  337. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/stack/profiles/frameworks/nextjs.yaml +0 -0
  338. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/stack/project.py +0 -0
  339. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/stack/registry.py +0 -0
  340. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/stack/resolve.py +0 -0
  341. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/surface_reconciliation.py +0 -0
  342. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/synth.py +0 -0
  343. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/templates/codd.yaml.tmpl +0 -0
  344. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/templates/conventions.yaml.tmpl +0 -0
  345. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/templates/data_dependencies.yaml.tmpl +0 -0
  346. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/templates/doc_links.yaml.tmpl +0 -0
  347. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/templates/extract_ai_prompt_baseline.md +0 -0
  348. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/templates/extracted/api-contract.md.j2 +0 -0
  349. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/templates/extracted/architecture-overview.md.j2 +0 -0
  350. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/templates/extracted/module-detail.md.j2 +0 -0
  351. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/templates/extracted/schema-design.md.j2 +0 -0
  352. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/templates/extracted/system-context.md.j2 +0 -0
  353. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/templates/gitignore.tmpl +0 -0
  354. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/templates/lexicon_questions.md +0 -0
  355. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/templates/lexicon_schema.yaml +0 -0
  356. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/templates/overrides.yaml.tmpl +0 -0
  357. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/test_detection.py +0 -0
  358. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/test_import_coherence.py +0 -0
  359. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/traceability.py +0 -0
  360. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/validator.py +0 -0
  361. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/vb_marker_authenticity.py +0 -0
  362. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/vb_rerun_scope.py +0 -0
  363. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/verifiable_behavior_audit.py +0 -0
  364. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/watch/__init__.py +0 -0
  365. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/watch/events.py +0 -0
  366. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/watch/propagation_log.py +0 -0
  367. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/watch/propagation_pipeline.py +0 -0
  368. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/watch/test_runner.py +0 -0
  369. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/watch/watcher.py +0 -0
  370. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd/wiring.py +0 -0
  371. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/ai_governance_eu_act/coverage_matrix.md +0 -0
  372. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/ai_governance_eu_act/elicit_extend.md +0 -0
  373. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/ai_governance_eu_act/lexicon.yaml +0 -0
  374. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/ai_governance_eu_act/manifest.yaml +0 -0
  375. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/ai_governance_eu_act/recommended_kinds.yaml +0 -0
  376. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/ai_governance_eu_act/severity_rules.yaml +0 -0
  377. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/api_rate_limiting_caching/coverage_matrix.md +0 -0
  378. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/api_rate_limiting_caching/elicit_extend.md +0 -0
  379. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/api_rate_limiting_caching/lexicon.yaml +0 -0
  380. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/api_rate_limiting_caching/manifest.yaml +0 -0
  381. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/api_rate_limiting_caching/recommended_kinds.yaml +0 -0
  382. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/api_rate_limiting_caching/severity_rules.yaml +0 -0
  383. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/api_rest_openapi/coverage_matrix.md +0 -0
  384. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/api_rest_openapi/elicit_extend.md +0 -0
  385. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/api_rest_openapi/lexicon.yaml +0 -0
  386. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/api_rest_openapi/manifest.yaml +0 -0
  387. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/api_rest_openapi/recommended_kinds.yaml +0 -0
  388. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/api_rest_openapi/severity_rules.yaml +0 -0
  389. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/babok/elicit_extend.md +0 -0
  390. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/babok/lexicon.yaml +0 -0
  391. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/babok/manifest.yaml +0 -0
  392. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/babok/recommended_kinds.yaml +0 -0
  393. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/babok/severity_rules.yaml +0 -0
  394. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/backend_event_cloudevents/coverage_matrix.md +0 -0
  395. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/backend_event_cloudevents/elicit_extend.md +0 -0
  396. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/backend_event_cloudevents/lexicon.yaml +0 -0
  397. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/backend_event_cloudevents/manifest.yaml +0 -0
  398. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/backend_event_cloudevents/recommended_kinds.yaml +0 -0
  399. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/backend_event_cloudevents/severity_rules.yaml +0 -0
  400. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/backend_graphql/coverage_matrix.md +0 -0
  401. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/backend_graphql/elicit_extend.md +0 -0
  402. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/backend_graphql/lexicon.yaml +0 -0
  403. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/backend_graphql/manifest.yaml +0 -0
  404. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/backend_graphql/recommended_kinds.yaml +0 -0
  405. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/backend_graphql/severity_rules.yaml +0 -0
  406. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/backend_grpc_proto/coverage_matrix.md +0 -0
  407. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/backend_grpc_proto/elicit_extend.md +0 -0
  408. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/backend_grpc_proto/lexicon.yaml +0 -0
  409. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/backend_grpc_proto/manifest.yaml +0 -0
  410. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/backend_grpc_proto/recommended_kinds.yaml +0 -0
  411. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/backend_grpc_proto/severity_rules.yaml +0 -0
  412. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/compliance_hipaa/coverage_matrix.md +0 -0
  413. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/compliance_hipaa/elicit_extend.md +0 -0
  414. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/compliance_hipaa/lexicon.yaml +0 -0
  415. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/compliance_hipaa/manifest.yaml +0 -0
  416. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/compliance_hipaa/recommended_kinds.yaml +0 -0
  417. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/compliance_hipaa/severity_rules.yaml +0 -0
  418. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/compliance_iso27001/coverage_matrix.md +0 -0
  419. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/compliance_iso27001/elicit_extend.md +0 -0
  420. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/compliance_iso27001/lexicon.yaml +0 -0
  421. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/compliance_iso27001/manifest.yaml +0 -0
  422. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/compliance_iso27001/recommended_kinds.yaml +0 -0
  423. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/compliance_iso27001/severity_rules.yaml +0 -0
  424. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/compliance_pci_dss_4/coverage_matrix.md +0 -0
  425. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/compliance_pci_dss_4/elicit_extend.md +0 -0
  426. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/compliance_pci_dss_4/lexicon.yaml +0 -0
  427. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/compliance_pci_dss_4/manifest.yaml +0 -0
  428. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/compliance_pci_dss_4/recommended_kinds.yaml +0 -0
  429. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/compliance_pci_dss_4/severity_rules.yaml +0 -0
  430. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/data_aggregation_policies/coverage_matrix.md +0 -0
  431. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/data_aggregation_policies/elicit_extend.md +0 -0
  432. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/data_aggregation_policies/lexicon.yaml +0 -0
  433. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/data_aggregation_policies/manifest.yaml +0 -0
  434. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/data_aggregation_policies/recommended_kinds.yaml +0 -0
  435. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/data_aggregation_policies/severity_rules.yaml +0 -0
  436. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/coverage_matrix.md +0 -0
  437. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/elicit_extend.md +0 -0
  438. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/lexicon.yaml +0 -0
  439. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/manifest.yaml +0 -0
  440. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/recommended_kinds.yaml +0 -0
  441. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/severity_rules.yaml +0 -0
  442. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/data_governance_appi_gdpr/coverage_matrix.md +0 -0
  443. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/data_governance_appi_gdpr/elicit_extend.md +0 -0
  444. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/data_governance_appi_gdpr/lexicon.yaml +0 -0
  445. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/data_governance_appi_gdpr/manifest.yaml +0 -0
  446. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/data_governance_appi_gdpr/recommended_kinds.yaml +0 -0
  447. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/data_governance_appi_gdpr/severity_rules.yaml +0 -0
  448. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/data_nosql_jsonschema/coverage_matrix.md +0 -0
  449. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/data_nosql_jsonschema/elicit_extend.md +0 -0
  450. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/data_nosql_jsonschema/lexicon.yaml +0 -0
  451. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/data_nosql_jsonschema/manifest.yaml +0 -0
  452. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/data_nosql_jsonschema/recommended_kinds.yaml +0 -0
  453. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/data_nosql_jsonschema/severity_rules.yaml +0 -0
  454. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/data_relational_iso_sql/coverage_matrix.md +0 -0
  455. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/data_relational_iso_sql/elicit_extend.md +0 -0
  456. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/data_relational_iso_sql/lexicon.yaml +0 -0
  457. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/data_relational_iso_sql/manifest.yaml +0 -0
  458. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/data_relational_iso_sql/recommended_kinds.yaml +0 -0
  459. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/data_relational_iso_sql/severity_rules.yaml +0 -0
  460. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/ddd_domain_driven_design/coverage_matrix.md +0 -0
  461. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/ddd_domain_driven_design/elicit_extend.md +0 -0
  462. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/ddd_domain_driven_design/lexicon.yaml +0 -0
  463. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/ddd_domain_driven_design/manifest.yaml +0 -0
  464. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/ddd_domain_driven_design/recommended_kinds.yaml +0 -0
  465. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/ddd_domain_driven_design/severity_rules.yaml +0 -0
  466. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/dora_sre_metrics/coverage_matrix.md +0 -0
  467. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/dora_sre_metrics/elicit_extend.md +0 -0
  468. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/dora_sre_metrics/lexicon.yaml +0 -0
  469. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/dora_sre_metrics/manifest.yaml +0 -0
  470. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/dora_sre_metrics/recommended_kinds.yaml +0 -0
  471. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/dora_sre_metrics/severity_rules.yaml +0 -0
  472. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/i18n_unicode_cldr/coverage_matrix.md +0 -0
  473. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/i18n_unicode_cldr/elicit_extend.md +0 -0
  474. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/i18n_unicode_cldr/lexicon.yaml +0 -0
  475. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/i18n_unicode_cldr/manifest.yaml +0 -0
  476. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/i18n_unicode_cldr/recommended_kinds.yaml +0 -0
  477. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/i18n_unicode_cldr/severity_rules.yaml +0 -0
  478. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/ml_model_cards/coverage_matrix.md +0 -0
  479. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/ml_model_cards/elicit_extend.md +0 -0
  480. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/ml_model_cards/lexicon.yaml +0 -0
  481. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/ml_model_cards/manifest.yaml +0 -0
  482. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/ml_model_cards/recommended_kinds.yaml +0 -0
  483. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/ml_model_cards/severity_rules.yaml +0 -0
  484. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/mobile_a11y_native/coverage_matrix.md +0 -0
  485. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/mobile_a11y_native/elicit_extend.md +0 -0
  486. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/mobile_a11y_native/lexicon.yaml +0 -0
  487. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/mobile_a11y_native/manifest.yaml +0 -0
  488. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/mobile_a11y_native/recommended_kinds.yaml +0 -0
  489. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/mobile_a11y_native/severity_rules.yaml +0 -0
  490. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/mobile_android_material3/coverage_matrix.md +0 -0
  491. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/mobile_android_material3/elicit_extend.md +0 -0
  492. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/mobile_android_material3/lexicon.yaml +0 -0
  493. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/mobile_android_material3/manifest.yaml +0 -0
  494. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/mobile_android_material3/recommended_kinds.yaml +0 -0
  495. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/mobile_android_material3/severity_rules.yaml +0 -0
  496. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/mobile_ios_hig/coverage_matrix.md +0 -0
  497. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/mobile_ios_hig/elicit_extend.md +0 -0
  498. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/mobile_ios_hig/lexicon.yaml +0 -0
  499. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/mobile_ios_hig/manifest.yaml +0 -0
  500. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/mobile_ios_hig/recommended_kinds.yaml +0 -0
  501. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/mobile_ios_hig/severity_rules.yaml +0 -0
  502. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/mobile_security_masvs/coverage_matrix.md +0 -0
  503. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/mobile_security_masvs/elicit_extend.md +0 -0
  504. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/mobile_security_masvs/lexicon.yaml +0 -0
  505. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/mobile_security_masvs/manifest.yaml +0 -0
  506. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/mobile_security_masvs/recommended_kinds.yaml +0 -0
  507. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/mobile_security_masvs/severity_rules.yaml +0 -0
  508. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/ops_cicd_pipeline/coverage_matrix.md +0 -0
  509. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/ops_cicd_pipeline/elicit_extend.md +0 -0
  510. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/ops_cicd_pipeline/lexicon.yaml +0 -0
  511. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/ops_cicd_pipeline/manifest.yaml +0 -0
  512. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/ops_cicd_pipeline/recommended_kinds.yaml +0 -0
  513. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/ops_cicd_pipeline/severity_rules.yaml +0 -0
  514. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/ops_iac_terraform/coverage_matrix.md +0 -0
  515. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/ops_iac_terraform/elicit_extend.md +0 -0
  516. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/ops_iac_terraform/lexicon.yaml +0 -0
  517. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/ops_iac_terraform/manifest.yaml +0 -0
  518. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/ops_iac_terraform/recommended_kinds.yaml +0 -0
  519. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/ops_iac_terraform/severity_rules.yaml +0 -0
  520. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/ops_kubernetes/coverage_matrix.md +0 -0
  521. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/ops_kubernetes/elicit_extend.md +0 -0
  522. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/ops_kubernetes/lexicon.yaml +0 -0
  523. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/ops_kubernetes/manifest.yaml +0 -0
  524. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/ops_kubernetes/recommended_kinds.yaml +0 -0
  525. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/ops_kubernetes/severity_rules.yaml +0 -0
  526. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/ops_observability_otel/coverage_matrix.md +0 -0
  527. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/ops_observability_otel/elicit_extend.md +0 -0
  528. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/ops_observability_otel/lexicon.yaml +0 -0
  529. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/ops_observability_otel/manifest.yaml +0 -0
  530. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/ops_observability_otel/recommended_kinds.yaml +0 -0
  531. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/ops_observability_otel/severity_rules.yaml +0 -0
  532. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/process_iso25010/coverage_matrix.md +0 -0
  533. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/process_iso25010/elicit_extend.md +0 -0
  534. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/process_iso25010/lexicon.yaml +0 -0
  535. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/process_iso25010/manifest.yaml +0 -0
  536. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/process_iso25010/recommended_kinds.yaml +0 -0
  537. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/process_iso25010/severity_rules.yaml +0 -0
  538. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/process_test_iso29119/coverage_matrix.md +0 -0
  539. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/process_test_iso29119/elicit_extend.md +0 -0
  540. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/process_test_iso29119/lexicon.yaml +0 -0
  541. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/process_test_iso29119/manifest.yaml +0 -0
  542. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/process_test_iso29119/recommended_kinds.yaml +0 -0
  543. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/process_test_iso29119/severity_rules.yaml +0 -0
  544. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/twelve_factor_app/coverage_matrix.md +0 -0
  545. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/twelve_factor_app/elicit_extend.md +0 -0
  546. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/twelve_factor_app/lexicon.yaml +0 -0
  547. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/twelve_factor_app/manifest.yaml +0 -0
  548. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/twelve_factor_app/recommended_kinds.yaml +0 -0
  549. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/twelve_factor_app/severity_rules.yaml +0 -0
  550. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/coverage_matrix.md +0 -0
  551. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/elicit_extend.md +0 -0
  552. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/lexicon.yaml +0 -0
  553. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/manifest.yaml +0 -0
  554. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/recommended_kinds.yaml +0 -0
  555. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/severity_rules.yaml +0 -0
  556. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/web_authn_webauthn/coverage_matrix.md +0 -0
  557. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/web_authn_webauthn/elicit_extend.md +0 -0
  558. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/web_authn_webauthn/lexicon.yaml +0 -0
  559. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/web_authn_webauthn/manifest.yaml +0 -0
  560. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/web_authn_webauthn/recommended_kinds.yaml +0 -0
  561. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/web_authn_webauthn/severity_rules.yaml +0 -0
  562. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/web_browser_compat/coverage_matrix.md +0 -0
  563. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/web_browser_compat/elicit_extend.md +0 -0
  564. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/web_browser_compat/lexicon.yaml +0 -0
  565. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/web_browser_compat/manifest.yaml +0 -0
  566. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/web_browser_compat/recommended_kinds.yaml +0 -0
  567. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/web_browser_compat/severity_rules.yaml +0 -0
  568. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/web_forms_html5/coverage_matrix.md +0 -0
  569. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/web_forms_html5/elicit_extend.md +0 -0
  570. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/web_forms_html5/lexicon.yaml +0 -0
  571. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/web_forms_html5/manifest.yaml +0 -0
  572. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/web_forms_html5/recommended_kinds.yaml +0 -0
  573. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/web_forms_html5/severity_rules.yaml +0 -0
  574. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/web_performance_core_web_vitals/coverage_matrix.md +0 -0
  575. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/web_performance_core_web_vitals/elicit_extend.md +0 -0
  576. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/web_performance_core_web_vitals/lexicon.yaml +0 -0
  577. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/web_performance_core_web_vitals/manifest.yaml +0 -0
  578. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/web_performance_core_web_vitals/recommended_kinds.yaml +0 -0
  579. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/web_performance_core_web_vitals/severity_rules.yaml +0 -0
  580. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/web_pwa_manifest/coverage_matrix.md +0 -0
  581. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/web_pwa_manifest/elicit_extend.md +0 -0
  582. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/web_pwa_manifest/lexicon.yaml +0 -0
  583. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/web_pwa_manifest/manifest.yaml +0 -0
  584. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/web_pwa_manifest/recommended_kinds.yaml +0 -0
  585. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/web_pwa_manifest/severity_rules.yaml +0 -0
  586. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/web_responsive/coverage_matrix.md +0 -0
  587. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/web_responsive/elicit_extend.md +0 -0
  588. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/web_responsive/lexicon.yaml +0 -0
  589. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/web_responsive/manifest.yaml +0 -0
  590. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/web_responsive/recommended_kinds.yaml +0 -0
  591. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/web_responsive/severity_rules.yaml +0 -0
  592. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/web_security_owasp/coverage_matrix.md +0 -0
  593. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/web_security_owasp/elicit_extend.md +0 -0
  594. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/web_security_owasp/lexicon.yaml +0 -0
  595. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/web_security_owasp/manifest.yaml +0 -0
  596. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/web_security_owasp/recommended_kinds.yaml +0 -0
  597. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/web_security_owasp/severity_rules.yaml +0 -0
  598. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/web_seo_schemaorg/coverage_matrix.md +0 -0
  599. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/web_seo_schemaorg/elicit_extend.md +0 -0
  600. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/web_seo_schemaorg/lexicon.yaml +0 -0
  601. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/web_seo_schemaorg/manifest.yaml +0 -0
  602. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/web_seo_schemaorg/recommended_kinds.yaml +0 -0
  603. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/lexicons/web_seo_schemaorg/severity_rules.yaml +0 -0
  604. {codd_dev-2.90.0 → codd_dev-2.91.0}/codd_plugins/stack_map.yaml +0 -0
  605. {codd_dev-2.90.0 → codd_dev-2.91.0}/docs/cookbook/cdp_browser/README.md +0 -0
  606. {codd_dev-2.90.0 → codd_dev-2.91.0}/docs/cookbook/presentation_aggregation/README.md +0 -0
  607. {codd_dev-2.90.0 → codd_dev-2.91.0}/docs/requirements/README.md +0 -0
  608. {codd_dev-2.90.0 → codd_dev-2.91.0}/dogfood/README.md +0 -0
  609. {codd_dev-2.90.0 → codd_dev-2.91.0}/dogfood/fixtures/flat_py_app/README.md +0 -0
  610. {codd_dev-2.90.0 → codd_dev-2.91.0}/examples/README.md +0 -0
  611. {codd_dev-2.90.0 → codd_dev-2.91.0}/skills/codd-assemble/SKILL.md +0 -0
  612. {codd_dev-2.90.0 → codd_dev-2.91.0}/skills/codd-evolve/SKILL.md +0 -0
  613. {codd_dev-2.90.0 → codd_dev-2.91.0}/skills/codd-generate/SKILL.md +0 -0
  614. {codd_dev-2.90.0 → codd_dev-2.91.0}/skills/codd-greenfield/SKILL.md +0 -0
  615. {codd_dev-2.90.0 → codd_dev-2.91.0}/skills/codd-impact/SKILL.md +0 -0
  616. {codd_dev-2.90.0 → codd_dev-2.91.0}/skills/codd-init/SKILL.md +0 -0
  617. {codd_dev-2.90.0 → codd_dev-2.91.0}/skills/codd-propagate/SKILL.md +0 -0
  618. {codd_dev-2.90.0 → codd_dev-2.91.0}/skills/codd-restore/SKILL.md +0 -0
  619. {codd_dev-2.90.0 → codd_dev-2.91.0}/skills/codd-scan/SKILL.md +0 -0
  620. {codd_dev-2.90.0 → codd_dev-2.91.0}/skills/codd-validate/SKILL.md +0 -0
  621. {codd_dev-2.90.0 → codd_dev-2.91.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.90.0
3
+ Version: 2.91.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.90.0"
3
+ __version__ = "2.91.0"
@@ -7600,7 +7600,7 @@ def _load_optional_project_config(project_root: Path) -> dict[str, Any]:
7600
7600
  return {}
7601
7601
 
7602
7602
 
7603
- def _intake_stack_contract_for_verify(project_root: Path) -> None:
7603
+ def _intake_stack_contract_for_verify(project_root: Path, *, stack_command_executor=None) -> None:
7604
7604
  """Resolve the project's declared stack contract into the verify run trace.
7605
7605
 
7606
7606
  Contract Kernel v2.77a (intake only) — the verify-path mirror of the greenfield
@@ -7609,6 +7609,11 @@ def _intake_stack_contract_for_verify(project_root: Path) -> None:
7609
7609
  the run trace), WITHOUT enforcing any obligation or changing the verify verdict
7610
7610
  (obligation enforcement is v2.77b-e).
7611
7611
 
7612
+ ``stack_command_executor`` is the v2.77c materialization seam (default: the real
7613
+ subprocess executor): an injectable executor that invokes each composed stack
7614
+ command slot (exit-code only). Tests pass a recording/sentinel executor so the
7615
+ declared slots are provably invoked without real Next.js/Playwright.
7616
+
7612
7617
  * No ``stack:`` block → no-op (the opt-in framework layer is unused; the vast
7613
7618
  majority of projects — emits a single trace line, no behaviour change).
7614
7619
  * A declared stack → its ``stack_contract_hash`` is echoed to the run trace.
@@ -7658,6 +7663,34 @@ def _intake_stack_contract_for_verify(project_root: Path) -> None:
7658
7663
  if gate.red:
7659
7664
  raise SystemExit(1)
7660
7665
 
7666
+ # Stack command MATERIALIZATION (Contract Kernel v2.77c) — the verify-path mirror
7667
+ # of the greenfield pipeline's :meth:`_materialize_stack_commands`. (1) CONFLICT
7668
+ # GATE: a composition conflict (command collision / unproved replace / weakened
7669
+ # obligation / exclusive / deny) is RED (honest non-zero exit) — the composer
7670
+ # already refuses a silent last-wins merge by recording a Conflict; this makes it
7671
+ # a gate. (2) PLAN + EXECUTE: build a deterministic, contract-driven command plan
7672
+ # (NO framework literal) and INVOKE each composed slot by exit code, so a declared
7673
+ # framework_build/e2e_test is genuinely run on verify (not silently skipped while
7674
+ # the language verify greens alone). Exit-code ONLY here; command AUTHENTICITY is
7675
+ # v2.77d and the obligation-checker gate is v2.77e (out of lane).
7676
+ from codd.stack.command_plan import (
7677
+ StackCommandMaterializationError,
7678
+ StackContractConflictError,
7679
+ materialize_stack_command_plan,
7680
+ )
7681
+
7682
+ try:
7683
+ plan, _result = materialize_stack_command_plan(
7684
+ contract, project_root, executor=stack_command_executor
7685
+ )
7686
+ except (StackContractConflictError, StackCommandMaterializationError) as exc:
7687
+ click.echo(f"[verify] stack command materialization: {exc}", err=True)
7688
+ raise SystemExit(1) from exc
7689
+ click.echo(
7690
+ f"[verify] stack command materialization: {len(plan.slots)} slot(s) invoked "
7691
+ f"({', '.join(plan.command_ids)})"
7692
+ )
7693
+
7661
7694
 
7662
7695
  def _run_verify_once(
7663
7696
  path: str,
@@ -313,6 +313,11 @@ CiScaffoldRunner = Callable[..., str]
313
313
  PropagateRunner = Callable[..., str]
314
314
  CheckRunner = Callable[[Path], str]
315
315
  Notifier = Callable[[str, str], bool]
316
+ #: Injectable seam for the v2.77c stack-command materialization executor (a slot →
317
+ #: exit-code outcome). Default (None) uses the real subprocess executor in
318
+ #: ``codd.stack.command_plan``; tests inject a recording/sentinel executor so the
319
+ #: declared stack command slots are provably invoked without real Next.js/Playwright.
320
+ StackCommandExecutor = Callable[..., Any]
316
321
 
317
322
 
318
323
  class GreenfieldPipeline:
@@ -351,6 +356,7 @@ class GreenfieldPipeline:
351
356
  propagate_runner: PropagateRunner | None = None,
352
357
  check_runner: CheckRunner | None = None,
353
358
  notifier: Notifier | None = None,
359
+ stack_command_executor: StackCommandExecutor | None = None,
354
360
  echo: Callable[[str], None] = print,
355
361
  ) -> None:
356
362
  self.project_name = project_name
@@ -380,6 +386,7 @@ class GreenfieldPipeline:
380
386
  self.propagate_runner = propagate_runner
381
387
  self.check_runner = check_runner
382
388
  self.notifier = notifier
389
+ self.stack_command_executor = stack_command_executor
383
390
  self.echo = echo
384
391
 
385
392
  def _restore_session_options(self, session: dict[str, Any]) -> None:
@@ -500,6 +507,32 @@ class GreenfieldPipeline:
500
507
  {"status": STATUS_PENDING, "detail": ""}, str(exc),
501
508
  )
502
509
 
510
+ # Stack command MATERIALIZATION (Contract Kernel v2.77c) — connect the
511
+ # composed stack commands (and thus the stack obligations) to the run's
512
+ # ACTUAL verify/build/test command plan. Two parts (both RED-routed through
513
+ # _fail, like intake/lock):
514
+ # 1. CONFLICT GATE — a composition conflict (command collision / unproved
515
+ # replace / weakened obligation / exclusive / deny) is RED. The composer
516
+ # already records these (it refuses last-wins); this makes that a gate.
517
+ # 2. PLAN + EXECUTE — build a deterministic, contract-driven command plan
518
+ # from contract.commands (NO framework literal) and INVOKE each slot by
519
+ # exit code, so a declared framework_build/e2e_test is genuinely run (not
520
+ # silently skipped while the language verify greens alone — the false
521
+ # green this step closes). Exit-code ONLY here; command AUTHENTICITY
522
+ # (no-op/"build":"true"/observed-no-tests) is v2.77d and the obligation-
523
+ # checker gate is v2.77e — both deliberately out of lane.
524
+ # Only for stack-declared projects (contract is not None) — a non-stack run
525
+ # never reaches here, so it is byte-identical (no plan, no execution, no new
526
+ # trace keys).
527
+ try:
528
+ if contract is not None:
529
+ self._materialize_stack_commands(project_root, session, contract)
530
+ except StageError as exc:
531
+ return self._fail(
532
+ project_root, session, options, "stack_commands",
533
+ {"status": STATUS_PENDING, "detail": ""}, str(exc),
534
+ )
535
+
503
536
  runners: dict[str, Callable[[Path, dict[str, Any], dict[str, Any]], None]] = {
504
537
  "init": self._stage_init,
505
538
  "elicit": self._stage_elicit,
@@ -667,6 +700,53 @@ class GreenfieldPipeline:
667
700
  if gate.red:
668
701
  raise StageError(gate.message)
669
702
 
703
+ # ── stack command materialization (Contract Kernel v2.77c) ──
704
+
705
+ def _materialize_stack_commands(self, project_root: Path, session: dict[str, Any], contract) -> None:
706
+ """Conflict-gate + materialize the composed stack commands into the run plan (v2.77c).
707
+
708
+ See the call site in :meth:`run`. Only invoked for stack-declared projects.
709
+
710
+ 1. CONFLICT GATE — :func:`assert_stack_contract_clean` (inside
711
+ :func:`stack_command_plan`) raises :class:`StackContractConflictError` on
712
+ ANY composition conflict (command collision / unproved replace / weakened
713
+ obligation / exclusive / deny). That is RED — the composer already refuses
714
+ a silent last-wins merge by recording a ``Conflict``; this makes it a gate.
715
+ 2. MATERIALIZE — build a deterministic, contract-driven command plan and
716
+ INVOKE each composed slot by exit code (via the injectable
717
+ ``stack_command_executor`` seam). A failing slot raises
718
+ :class:`StackCommandMaterializationError`. Both domain errors become a
719
+ :class:`StageError` so the autopilot reports them honestly (the run does
720
+ NOT advance to the stage loop with a conflicted/failing stack plan).
721
+
722
+ The materialized plan + executed slot ids are recorded in the run trace
723
+ (observable, like the intake hash + lock verdict) so "the declared stack
724
+ command slots were invoked" is provable. Exit-code only — authenticity is
725
+ v2.77d, the obligation-checker gate is v2.77e.
726
+ """
727
+ from codd.stack.command_plan import (
728
+ StackCommandMaterializationError,
729
+ StackContractConflictError,
730
+ materialize_stack_command_plan,
731
+ )
732
+
733
+ try:
734
+ plan, result = materialize_stack_command_plan(
735
+ contract, project_root, executor=self.stack_command_executor
736
+ )
737
+ except (StackContractConflictError, StackCommandMaterializationError) as exc:
738
+ self.echo(f"[greenfield] stack command materialization: {exc}")
739
+ raise StageError(str(exc)) from exc
740
+
741
+ record = session.get("stack_contract")
742
+ if isinstance(record, dict):
743
+ record["stack_command_plan"] = plan.to_record()
744
+ record["stack_commands_executed"] = list(result.executed_slot_ids)
745
+ self.echo(
746
+ "[greenfield] stack command materialization: "
747
+ f"{len(plan.slots)} slot(s) invoked ({', '.join(plan.command_ids)})"
748
+ )
749
+
670
750
  # ── option resolution ───────────────────────────────────
671
751
 
672
752
  def _resolve_options(self, project_root: Path) -> dict[str, Any]:
@@ -0,0 +1,385 @@
1
+ """Materialize a ResolvedStackContract's composed commands into the run's command plan.
2
+
3
+ Contract Kernel v2.77c (Stack Command Materialization). v2.77a brought the
4
+ framework-stack contract LIVE (intake hash → trace); v2.77b made the lock a
5
+ red/green gate. This step connects the *composed commands* (and, through them, the
6
+ stack obligations) to the verify/build/test command plan the run ACTUALLY executes
7
+ — so a declared ``framework_build`` / ``e2e_test`` / ``migration_check`` slot is
8
+ genuinely invoked, not silently ignored while the run greens on the language verify
9
+ alone (the false-green this step removes, GPT-5.5 Pro consult 2026-06-21).
10
+
11
+ Two responsibilities, kept PURE (this module imports neither pipeline nor CLI code;
12
+ it raises domain errors the call-sites translate):
13
+
14
+ 1. **Conflict gate** — :func:`assert_stack_contract_clean` reds on ANY composition
15
+ conflict (command collision / unproved replace / semantic weaken / exclusive /
16
+ deny / any future kind) via :class:`StackContractConflictError`. The composer
17
+ (``codd.stack.compose``) is the authority that lowers those into ``Conflict``
18
+ entries — this module does NOT reimplement merge semantics, it gates on them.
19
+ Defensive: it also reds on ``not is_clean`` / ``not strict_ok`` so an invalid
20
+ contract state (conflicts cleared but a flag still false) can never sneak to
21
+ green. "last-wins" is forbidden because the composer records a ``Conflict``
22
+ instead of silently overwriting; this gate turns that record into a RED.
23
+
24
+ 2. **Materialization** — :func:`stack_command_plan` builds a deterministic, ordered
25
+ :class:`StackCommandPlan` from ``contract.commands`` + ``contract.command_owners``
26
+ (NO framework-name literal — the plan is driven entirely by the resolved
27
+ contract), and :func:`execute_stack_command_plan` actually invokes each slot by
28
+ exit code. A non-zero / un-spawnable / timed-out slot is RED. This is exit-code
29
+ pass/fail ONLY — proving the declared stack command slots were INVOKED. Proving
30
+ those invoked commands are *meaningful* (no-op / ``"build": "true"`` / empty
31
+ script / missing reporter / observed-no-tests) is v2.77d (command authenticity),
32
+ a SEPARATE seam; the obligation-checker gate (``verify_project_stack``) is v2.77e.
33
+
34
+ A project with no ``stack:`` block resolves to ``contract is None`` and never
35
+ reaches this module — the call-sites hard-branch on ``contract is not None``, so
36
+ non-stack runs are byte-identical (no plan, no new trace keys, no execution).
37
+ """
38
+
39
+ from __future__ import annotations
40
+
41
+ import os
42
+ import subprocess # noqa: S404 — argv comes from the trusted resolved stack contract, shell=False.
43
+ from dataclasses import dataclass, field
44
+ from pathlib import Path
45
+ from typing import Mapping, Protocol, Sequence
46
+
47
+ from codd.languages.profile import CommandSpec
48
+
49
+ from .compose import ResolvedStackContract
50
+
51
+ #: Default wall-clock cap for a single stack command slot. A slot that exceeds it is
52
+ #: RED (a timeout is never green), never a hang that blocks the gate forever. Mirrors
53
+ #: ``codd.languages.verify_executor.DEFAULT_VERIFY_TIMEOUT_SECONDS``.
54
+ DEFAULT_STACK_COMMAND_TIMEOUT_SECONDS = 1800
55
+
56
+ #: Layer-kind ordering for a deterministic plan: language slots first, then
57
+ #: framework, then addon (the design's composition order — §合成順序). Unknown
58
+ #: owner kinds sort last (stable, after the known kinds) so the plan is still
59
+ #: deterministic for a future layer kind.
60
+ _OWNER_KIND_ORDER = {"language": 0, "framework": 1, "addon": 2, "runtime": 3, "platform": 4}
61
+
62
+
63
+ class StackContractConflictError(RuntimeError):
64
+ """A resolved stack contract carries a composition conflict — the gate reds.
65
+
66
+ Raised by :func:`assert_stack_contract_clean`. The call-sites translate it to
67
+ their context's RED (``StageError`` in the greenfield pipeline → ``_fail``;
68
+ ``SystemExit`` non-zero on the verify CLI path).
69
+ """
70
+
71
+
72
+ class StackCommandMaterializationError(RuntimeError):
73
+ """A composed stack command slot failed when actually invoked (exit-code RED).
74
+
75
+ Raised by :func:`execute_stack_command_plan` when a slot exits non-zero, cannot
76
+ spawn, or times out. (Authenticity — whether an exit-0 slot was *meaningful* —
77
+ is v2.77d, NOT raised here.)
78
+ """
79
+
80
+
81
+ def _owner_sort_key(owner: str, slot_id: str) -> tuple[int, str, str]:
82
+ kind = owner.split(":", 1)[0] if owner else ""
83
+ return (_OWNER_KIND_ORDER.get(kind, len(_OWNER_KIND_ORDER)), owner, slot_id)
84
+
85
+
86
+ def assert_stack_contract_clean(contract: ResolvedStackContract) -> None:
87
+ """Conflict gate (v2.77c): red on ANY composition conflict / unclean state.
88
+
89
+ Anti-false-green: a command collision, an unproved replace (a layer replacing
90
+ another's command with different argv and no ``replace_with_proof`` — exactly a
91
+ command conflict today), a semantic weaken (an addon lowering a framework
92
+ obligation's severity), an exclusive conflict, a deny, or any future conflict
93
+ kind makes the contract NOT clean → :class:`StackContractConflictError`. The
94
+ composer already records these as ``Conflict`` entries (it refuses last-wins);
95
+ this turns that record into a gate. Defensive triple-check (``conflicts`` /
96
+ ``is_clean`` / ``strict_ok``) so a flag desync can never sneak to green.
97
+ """
98
+ if contract.conflicts or not contract.is_clean or not contract.strict_ok:
99
+ reasons = (
100
+ "; ".join(f"[{c.kind}] {c.detail}" for c in contract.conflicts)
101
+ or "resolved stack contract is not in a clean composed state"
102
+ )
103
+ raise StackContractConflictError(
104
+ f"stack composition conflict ({contract.stack_id}): {reasons}. "
105
+ "A command collision / unproved replace / weakened obligation / exclusive "
106
+ "conflict is RED — the composer does NOT silently last-wins-merge a "
107
+ "collision, and the run will not materialize a command plan from a "
108
+ "conflicted contract. Resolve the conflict in the stack profiles (or "
109
+ "declare an explicit replace_with_proof once that mechanism exists)."
110
+ )
111
+
112
+
113
+ @dataclass(frozen=True)
114
+ class StackCommandSlot:
115
+ """One materialized command slot in the run's plan, with its owning namespace.
116
+
117
+ ``slot_id`` is the command id (e.g. ``typecheck`` / ``framework_build`` /
118
+ ``e2e_test``); ``owner`` is its composed owner (``language:typescript`` /
119
+ ``framework:nextjs`` / ``addon:playwright``) — the namespace ownership that makes
120
+ a green in one slot never imply another. ``argv`` is the canonical (shell-free)
121
+ command. ``cwd``/``env`` may carry literal layout placeholders (not substituted
122
+ here — Phase-1 contract).
123
+ """
124
+
125
+ slot_id: str
126
+ owner: str
127
+ argv: tuple[str, ...]
128
+ cwd: str | None = None
129
+ env: Mapping[str, str] = field(default_factory=dict)
130
+ requires_materialized_deps: bool = False
131
+ report_path: str | None = None
132
+ report_adapter: str | None = None
133
+ report_capture: str | None = None
134
+
135
+ @property
136
+ def command_str(self) -> str:
137
+ return " ".join(self.argv)
138
+
139
+ def to_record(self) -> dict[str, object]:
140
+ rec: dict[str, object] = {
141
+ "slot": self.slot_id,
142
+ "owner": self.owner,
143
+ "argv": list(self.argv),
144
+ }
145
+ if self.cwd:
146
+ rec["cwd"] = self.cwd
147
+ return rec
148
+
149
+
150
+ @dataclass(frozen=True)
151
+ class StackCommandPlan:
152
+ """The deterministic, contract-driven plan of composed stack command slots.
153
+
154
+ Built ENTIRELY from ``contract.commands`` + ``contract.command_owners`` (no
155
+ framework literal): changing the stack profile/declaration changes the resolved
156
+ commands and thus this plan. ``content_hash`` ties the plan to the contract it
157
+ came from (observability — recorded in the run trace next to the stack hash).
158
+ """
159
+
160
+ stack_id: str
161
+ content_hash: str
162
+ slots: tuple[StackCommandSlot, ...]
163
+
164
+ @property
165
+ def command_ids(self) -> tuple[str, ...]:
166
+ return tuple(s.slot_id for s in self.slots)
167
+
168
+ def to_record(self) -> dict[str, object]:
169
+ return {
170
+ "stack_id": self.stack_id,
171
+ "stack_contract_hash": self.content_hash,
172
+ "command_slots": [s.to_record() for s in self.slots],
173
+ }
174
+
175
+
176
+ def _slot_from_command(slot_id: str, owner: str, spec: CommandSpec) -> StackCommandSlot:
177
+ report = spec.report
178
+ return StackCommandSlot(
179
+ slot_id=slot_id,
180
+ owner=owner,
181
+ argv=tuple(spec.argv),
182
+ cwd=spec.cwd,
183
+ env={str(k): str(v) for k, v in spec.env.items()},
184
+ requires_materialized_deps=bool(spec.requires_materialized_deps),
185
+ report_path=(report.path if report else None),
186
+ report_adapter=(report.adapter if report else None),
187
+ report_capture=(report.capture if report else None),
188
+ )
189
+
190
+
191
+ def stack_command_plan(contract: ResolvedStackContract) -> StackCommandPlan:
192
+ """Materialize the composed stack commands into a deterministic command plan.
193
+
194
+ Runs the conflict gate FIRST (:func:`assert_stack_contract_clean`) — a plan is
195
+ NEVER built from a conflicted contract. Then maps every composed command to a
196
+ :class:`StackCommandSlot` carrying its owning namespace, ordered deterministically
197
+ by owner kind (language → framework → addon) then owner then slot id. No
198
+ framework-name literal: the plan is a pure projection of the resolved contract.
199
+ """
200
+ assert_stack_contract_clean(contract)
201
+ owners = contract.command_owners
202
+ slots = [
203
+ _slot_from_command(slot_id, owners.get(slot_id, ""), spec)
204
+ for slot_id, spec in contract.commands.items()
205
+ ]
206
+ slots.sort(key=lambda s: _owner_sort_key(s.owner, s.slot_id))
207
+ return StackCommandPlan(
208
+ stack_id=contract.stack_id,
209
+ content_hash=contract.content_hash,
210
+ slots=tuple(slots),
211
+ )
212
+
213
+
214
+ @dataclass(frozen=True)
215
+ class StackCommandSlotResult:
216
+ """The exit-code outcome of invoking one stack command slot.
217
+
218
+ ``spawned`` is False when the tool could not be executed at all (missing
219
+ binary / spawn error); ``timed_out`` True when it exceeded the cap. ``ok`` is the
220
+ anti-false-green verdict: it requires the slot to have SPAWNED, NOT timed out,
221
+ and exited 0. (It says nothing about whether the command was *meaningful* — that
222
+ is v2.77d.)
223
+ """
224
+
225
+ slot_id: str
226
+ owner: str
227
+ command_str: str
228
+ spawned: bool
229
+ returncode: int | None
230
+ timed_out: bool
231
+ detail: str = ""
232
+
233
+ @property
234
+ def ok(self) -> bool:
235
+ return self.spawned and not self.timed_out and self.returncode == 0
236
+
237
+
238
+ @dataclass(frozen=True)
239
+ class StackCommandPlanResult:
240
+ """Aggregate result of executing a whole :class:`StackCommandPlan`."""
241
+
242
+ results: tuple[StackCommandSlotResult, ...]
243
+
244
+ @property
245
+ def ok(self) -> bool:
246
+ return all(r.ok for r in self.results)
247
+
248
+ @property
249
+ def failed(self) -> tuple[StackCommandSlotResult, ...]:
250
+ return tuple(r for r in self.results if not r.ok)
251
+
252
+ @property
253
+ def executed_slot_ids(self) -> tuple[str, ...]:
254
+ return tuple(r.slot_id for r in self.results)
255
+
256
+
257
+ class StackCommandExecutor(Protocol):
258
+ """Seam that invokes one stack command slot and reports its exit-code outcome.
259
+
260
+ The default (:func:`default_stack_command_executor`) shells out via
261
+ ``subprocess.run`` (trusted argv, ``shell=False``). Tests inject a recording /
262
+ sentinel-writing executor so they can prove the declared slots are actually
263
+ invoked WITHOUT needing real Next.js / Playwright (GPT-consult: "use a fake
264
+ fixture command that writes a sentinel or a mocked executor that records called
265
+ command ids").
266
+ """
267
+
268
+ def __call__(
269
+ self, slot: StackCommandSlot, project_root: Path, *, timeout: float
270
+ ) -> StackCommandSlotResult: ...
271
+
272
+
273
+ def default_stack_command_executor(
274
+ slot: StackCommandSlot, project_root: Path, *, timeout: float
275
+ ) -> StackCommandSlotResult:
276
+ """Invoke a slot via ``subprocess.run`` (exit-code only; trusted argv, shell=False).
277
+
278
+ Mirrors :func:`codd.languages.verify_executor.execute_verify_plan`'s spawn
279
+ handling: a missing binary / spawn error → ``spawned=False`` (RED); a timeout →
280
+ ``timed_out=True`` (RED); otherwise the real exit code. NO report parsing / test
281
+ observation here — that is v2.77d authenticity.
282
+ """
283
+ cwd = (project_root / slot.cwd) if slot.cwd else project_root
284
+ env = os.environ.copy()
285
+ env.update(slot.env)
286
+ try:
287
+ completed = subprocess.run( # noqa: S603 — trusted argv from the resolved contract, shell=False.
288
+ list(slot.argv),
289
+ shell=False,
290
+ cwd=str(cwd),
291
+ env=env,
292
+ capture_output=True,
293
+ text=True,
294
+ timeout=timeout,
295
+ )
296
+ except (FileNotFoundError, OSError) as exc:
297
+ return StackCommandSlotResult(
298
+ slot_id=slot.slot_id,
299
+ owner=slot.owner,
300
+ command_str=slot.command_str,
301
+ spawned=False,
302
+ returncode=None,
303
+ timed_out=False,
304
+ detail=f"stack command slot could not spawn ({slot.command_str!r}): {exc}",
305
+ )
306
+ except subprocess.TimeoutExpired:
307
+ return StackCommandSlotResult(
308
+ slot_id=slot.slot_id,
309
+ owner=slot.owner,
310
+ command_str=slot.command_str,
311
+ spawned=True,
312
+ returncode=None,
313
+ timed_out=True,
314
+ detail=f"stack command slot timed out after {timeout}s ({slot.command_str!r})",
315
+ )
316
+ return StackCommandSlotResult(
317
+ slot_id=slot.slot_id,
318
+ owner=slot.owner,
319
+ command_str=slot.command_str,
320
+ spawned=True,
321
+ returncode=completed.returncode,
322
+ timed_out=False,
323
+ detail=("" if completed.returncode == 0 else f"exit {completed.returncode}"),
324
+ )
325
+
326
+
327
+ def execute_stack_command_plan(
328
+ plan: StackCommandPlan,
329
+ project_root: Path,
330
+ *,
331
+ executor: StackCommandExecutor | None = None,
332
+ timeout: float | None = None,
333
+ ) -> StackCommandPlanResult:
334
+ """Invoke every slot in ``plan`` (exit-code pass/fail) and aggregate the result.
335
+
336
+ This is the materialization that makes "stack obligations affect actual
337
+ commands": the composed ``framework_build`` / ``e2e_test`` / ``migration_check``
338
+ slots are actually run, so a slot that would fail is no longer silently skipped
339
+ while the run greens on the language verify alone. ``executor`` is the injectable
340
+ seam (default: real subprocess). Exit-code ONLY — authenticity is v2.77d.
341
+ """
342
+ run_executor = executor if executor is not None else default_stack_command_executor
343
+ run_timeout = timeout if timeout is not None else DEFAULT_STACK_COMMAND_TIMEOUT_SECONDS
344
+ results = tuple(
345
+ run_executor(slot, project_root, timeout=run_timeout) for slot in plan.slots
346
+ )
347
+ return StackCommandPlanResult(results=results)
348
+
349
+
350
+ def materialize_stack_command_plan(
351
+ contract: ResolvedStackContract,
352
+ project_root: Path,
353
+ *,
354
+ executor: StackCommandExecutor | None = None,
355
+ timeout: float | None = None,
356
+ ) -> tuple[StackCommandPlan, StackCommandPlanResult]:
357
+ """Conflict-gate → build the plan → execute it, raising the domain RED on failure.
358
+
359
+ The single entry the pipeline / verify call-sites use:
360
+
361
+ * the conflict gate (:func:`assert_stack_contract_clean`, inside
362
+ :func:`stack_command_plan`) raises :class:`StackContractConflictError` on any
363
+ conflict;
364
+ * executing the plan raises :class:`StackCommandMaterializationError` if any slot
365
+ is not ``ok`` (non-zero / un-spawnable / timed out).
366
+
367
+ Returns ``(plan, result)`` on success so the caller can record the materialized
368
+ plan (and which slots executed) in the run trace.
369
+ """
370
+ plan = stack_command_plan(contract) # conflict gate runs here
371
+ result = execute_stack_command_plan(
372
+ plan, project_root, executor=executor, timeout=timeout
373
+ )
374
+ if not result.ok:
375
+ detail = "; ".join(
376
+ f"{r.slot_id} ({r.owner}): {r.detail or 'failed'}" for r in result.failed
377
+ )
378
+ raise StackCommandMaterializationError(
379
+ f"stack command materialization failed ({plan.stack_id}): {detail}. "
380
+ "A composed stack command slot was invoked and did NOT pass (exit-code) — "
381
+ "the declared framework/addon command is part of the run's command plan "
382
+ "and must run green (anti-false-green: a failing framework_build/e2e_test "
383
+ "is not silently skipped while the language verify greens alone)."
384
+ )
385
+ return plan, result
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "codd-dev"
7
- version = "2.90.0"
7
+ version = "2.91.0"
8
8
  description = "CoDD: Coherence-Driven Development — cross-artifact change impact analysis"
9
9
  readme = "README.md"
10
10
  license = "MIT"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes