codd-dev 2.89.0__tar.gz → 2.90.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.89.0 → codd_dev-2.90.0}/PKG-INFO +1 -1
  2. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/__init__.py +1 -1
  3. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/cli.py +29 -5
  4. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/greenfield/pipeline.py +85 -5
  5. codd_dev-2.90.0/codd/stack/lock.py +366 -0
  6. {codd_dev-2.89.0 → codd_dev-2.90.0}/pyproject.toml +1 -1
  7. codd_dev-2.89.0/codd/stack/lock.py +0 -133
  8. {codd_dev-2.89.0 → codd_dev-2.90.0}/.gitignore +0 -0
  9. {codd_dev-2.89.0 → codd_dev-2.90.0}/LICENSE +0 -0
  10. {codd_dev-2.89.0 → codd_dev-2.90.0}/README.md +0 -0
  11. {codd_dev-2.89.0 → codd_dev-2.90.0}/bench_fixture/README.md +0 -0
  12. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/__main__.py +0 -0
  13. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/_git_helper.py +0 -0
  14. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/action_outcome.py +0 -0
  15. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/ai_invoke.py +0 -0
  16. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/ai_patch.py +0 -0
  17. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/artifact_contract.py +0 -0
  18. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/artifact_ids.py +0 -0
  19. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/artifacts/catalog.yaml +0 -0
  20. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/ask_user_question_adapter.py +0 -0
  21. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/assembler.py +0 -0
  22. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/bridge.py +0 -0
  23. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/brownfield/__init__.py +0 -0
  24. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/brownfield/pipeline.py +0 -0
  25. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/capability_completeness.py +0 -0
  26. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/claude_cli.py +0 -0
  27. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/clustering.py +0 -0
  28. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/coherence_adapters.py +0 -0
  29. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/coherence_engine.py +0 -0
  30. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/confidence.py +0 -0
  31. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/config.py +0 -0
  32. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/config_schema.py +0 -0
  33. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/contracts.py +0 -0
  34. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/contracts_registry/__init__.py +0 -0
  35. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/contracts_registry/__main__.py +0 -0
  36. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/contracts_registry/certify.py +0 -0
  37. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/contracts_registry/generate_matrix.py +0 -0
  38. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/contracts_registry/registry.py +0 -0
  39. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/coverage_auditor.py +0 -0
  40. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/coverage_execution_coherence.py +0 -0
  41. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/coverage_metrics.py +0 -0
  42. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/dag/__init__.py +0 -0
  43. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/dag/auto_repair.py +0 -0
  44. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/dag/builder.py +0 -0
  45. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/dag/checks/__init__.py +0 -0
  46. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/dag/checks/_one_to_many_detection.py +0 -0
  47. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/dag/checks/artifact_contract_check.py +0 -0
  48. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/dag/checks/ci_health.py +0 -0
  49. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/dag/checks/dependency_freshness.py +0 -0
  50. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/dag/checks/depends_on_consistency.py +0 -0
  51. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/dag/checks/deployment_completeness.py +0 -0
  52. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/dag/checks/edge_validity.py +0 -0
  53. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/dag/checks/environment_coverage.py +0 -0
  54. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/dag/checks/implementation_coverage.py +0 -0
  55. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/dag/checks/node_completeness.py +0 -0
  56. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/dag/checks/opt_out.py +0 -0
  57. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/dag/checks/task_completion.py +0 -0
  58. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/dag/checks/transitive_closure.py +0 -0
  59. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/dag/checks/ui_coherence.py +0 -0
  60. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/dag/checks/user_journey_coherence.py +0 -0
  61. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/dag/coverage_axes.py +0 -0
  62. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/dag/defaults/cli.yaml +0 -0
  63. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/dag/defaults/cpp_embedded.yaml +0 -0
  64. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/dag/defaults/csharp.yaml +0 -0
  65. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/dag/defaults/elixir.yaml +0 -0
  66. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/dag/defaults/generic.yaml +0 -0
  67. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/dag/defaults/iot.yaml +0 -0
  68. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/dag/defaults/java.yaml +0 -0
  69. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/dag/defaults/kotlin.yaml +0 -0
  70. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/dag/defaults/mobile.yaml +0 -0
  71. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/dag/defaults/ruby.yaml +0 -0
  72. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/dag/defaults/rust.yaml +0 -0
  73. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/dag/defaults/scala.yaml +0 -0
  74. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/dag/defaults/swift.yaml +0 -0
  75. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/dag/defaults/test_frameworks.yaml +0 -0
  76. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/dag/defaults/web.yaml +0 -0
  77. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/dag/extractor.py +0 -0
  78. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/dag/impact.py +0 -0
  79. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/dag/runner.py +0 -0
  80. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/defaults.py +0 -0
  81. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/defaults.yaml +0 -0
  82. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/dependency_lock_coherence.py +0 -0
  83. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/deploy_targets/__init__.py +0 -0
  84. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/deploy_targets/app_service.py +0 -0
  85. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/deploy_targets/base.py +0 -0
  86. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/deploy_targets/docker_compose.py +0 -0
  87. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/deployer.py +0 -0
  88. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/deployment/__init__.py +0 -0
  89. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/deployment/checks/__init__.py +0 -0
  90. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/deployment/defaults/deploy_targets.yaml +0 -0
  91. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/deployment/defaults/runtime_capability_inference.yaml +0 -0
  92. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/deployment/defaults/schema_providers.yaml +0 -0
  93. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/deployment/defaults/verification_templates.yaml +0 -0
  94. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/deployment/extractor.py +0 -0
  95. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/deployment/providers/__init__.py +0 -0
  96. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/deployment/providers/ai_command.py +0 -0
  97. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/deployment/providers/ai_command_factory.py +0 -0
  98. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/deployment/providers/codex_app_server.py +0 -0
  99. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/deployment/providers/llm_consideration.py +0 -0
  100. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/deployment/providers/schema/__init__.py +0 -0
  101. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/deployment/providers/schema/prisma.py +0 -0
  102. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/deployment/providers/target/__init__.py +0 -0
  103. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/deployment/providers/target/docker_compose.py +0 -0
  104. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/deployment/providers/verification/__init__.py +0 -0
  105. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/deployment/providers/verification/assertion_handlers.py +0 -0
  106. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/deployment/providers/verification/cdp_browser.py +0 -0
  107. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/deployment/providers/verification/cdp_engines.py +0 -0
  108. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/deployment/providers/verification/cdp_launchers.py +0 -0
  109. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/deployment/providers/verification/cdp_wire.py +0 -0
  110. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/deployment/providers/verification/curl.py +0 -0
  111. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/deployment/providers/verification/form_strategies.py +0 -0
  112. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/deployment/providers/verification/means_catalog.py +0 -0
  113. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/deployment/providers/verification/playwright.py +0 -0
  114. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/deployment/providers/verification/pytest_http.py +0 -0
  115. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/deployment/providers/verification/vitest.py +0 -0
  116. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/design_md.py +0 -0
  117. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/diff/__init__.py +0 -0
  118. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/diff/apply.py +0 -0
  119. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/diff/engine.py +0 -0
  120. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/diff/persistence.py +0 -0
  121. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/diff/templates/diff_prompt.md +0 -0
  122. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/discovery.py +0 -0
  123. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/drift.py +0 -0
  124. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/e2e_contract_coherence.py +0 -0
  125. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/e2e_extractor.py +0 -0
  126. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/e2e_generator.py +0 -0
  127. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/e2e_harness.py +0 -0
  128. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/e2e_runner.py +0 -0
  129. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/elicit/__init__.py +0 -0
  130. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/elicit/apply.py +0 -0
  131. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/elicit/engine.py +0 -0
  132. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/elicit/finding.py +0 -0
  133. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/elicit/formatters/__init__.py +0 -0
  134. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/elicit/formatters/base.py +0 -0
  135. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/elicit/formatters/interactive.py +0 -0
  136. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/elicit/formatters/json_fmt.py +0 -0
  137. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/elicit/formatters/md.py +0 -0
  138. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/elicit/lexicon_loader.py +0 -0
  139. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/elicit/persistence.py +0 -0
  140. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/elicit/templates/elicit_prompt_L0.md +0 -0
  141. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/env_refs.py +0 -0
  142. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/extract_ai.py +0 -0
  143. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/extract_paths.py +0 -0
  144. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/extractor.py +0 -0
  145. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/fix/__init__.py +0 -0
  146. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/fix/candidate_selector.py +0 -0
  147. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/fix/design_updater.py +0 -0
  148. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/fix/impl_propagation.py +0 -0
  149. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/fix/interactive_prompt.py +0 -0
  150. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/fix/phenomenon_fixer.py +0 -0
  151. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/fix/phenomenon_parser.py +0 -0
  152. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/fix/risk_classifier.py +0 -0
  153. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/fix/templates/clarification_question.txt +0 -0
  154. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/fix/templates/design_update.txt +0 -0
  155. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/fix/templates/impl_update.txt +0 -0
  156. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/fix/templates/phenomenon_parse.txt +0 -0
  157. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/fix/templates/risk_assessment.txt +0 -0
  158. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/fix/templates_loader.py +0 -0
  159. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/fixer.py +0 -0
  160. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/fixup_drift.py +0 -0
  161. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/fixup_drift_strategies/__init__.py +0 -0
  162. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/fixup_drift_strategies/design_token_drift.py +0 -0
  163. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/fixup_drift_strategies/lexicon_violation.py +0 -0
  164. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/fixup_drift_strategies/url_drift.py +0 -0
  165. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/frontmatter.py +0 -0
  166. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/generator.py +0 -0
  167. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/git_evidence.py +0 -0
  168. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/graph.py +0 -0
  169. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/greenfield/__init__.py +0 -0
  170. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/hitl_session.py +0 -0
  171. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/hooks/__init__.py +0 -0
  172. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/hooks/pre-commit +0 -0
  173. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/hooks/recipes/claude_requirements_nudge.json +0 -0
  174. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/hooks/recipes/claude_settings_example.json +0 -0
  175. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/hooks/recipes/codex_hook.sh +0 -0
  176. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/hooks/recipes/git_post_commit.sh +0 -0
  177. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/hooks/recipes/git_pre_commit.sh +0 -0
  178. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/iac_nfr.py +0 -0
  179. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/implement_oracle.py +0 -0
  180. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/implement_oracle_scope.py +0 -0
  181. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/implement_oracle_types.py +0 -0
  182. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/implementer/__init__.py +0 -0
  183. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/implementer/chunked_runner.py +0 -0
  184. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/implementer/typecheck_loop.py +0 -0
  185. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/implementer.py +0 -0
  186. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/import_coherence.py +0 -0
  187. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/inheritance.py +0 -0
  188. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/init/__init__.py +0 -0
  189. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/init/lexicon_suggest.py +0 -0
  190. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/init/llm_lexicon_suggester.py +0 -0
  191. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/init/stack_detector.py +0 -0
  192. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/knowledge_fetcher.py +0 -0
  193. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/languages/__init__.py +0 -0
  194. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/languages/adapters/__init__.py +0 -0
  195. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/languages/adapters/implement_oracle.py +0 -0
  196. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/languages/adapters/oracle_go.py +0 -0
  197. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/languages/adapters/oracle_python.py +0 -0
  198. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/languages/adapters/oracle_typescript.py +0 -0
  199. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/languages/adapters/runner_report.py +0 -0
  200. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/languages/builtin_adapters.py +0 -0
  201. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/languages/compat.py +0 -0
  202. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/languages/contract.py +0 -0
  203. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/languages/loader.py +0 -0
  204. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/languages/oracle_executor.py +0 -0
  205. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/languages/path_planner.py +0 -0
  206. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/languages/profile.py +0 -0
  207. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/languages/profiles/go.yaml +0 -0
  208. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/languages/profiles/python.yaml +0 -0
  209. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/languages/profiles/typescript.yaml +0 -0
  210. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/languages/registry.py +0 -0
  211. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/languages/verify_executor.py +0 -0
  212. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/languages/verify_plan.py +0 -0
  213. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/lexicon.py +0 -0
  214. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/lexicon_cli/__init__.py +0 -0
  215. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/lexicon_cli/formatters/__init__.py +0 -0
  216. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/lexicon_cli/formatters/html.py +0 -0
  217. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/lexicon_cli/formatters/json_fmt.py +0 -0
  218. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/lexicon_cli/formatters/md.py +0 -0
  219. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/lexicon_cli/inspector.py +0 -0
  220. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/lexicon_cli/manager.py +0 -0
  221. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/lexicon_cli/reporter.py +0 -0
  222. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/lexicon_cli/threshold.py +0 -0
  223. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/llm/__init__.py +0 -0
  224. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/llm/approval.py +0 -0
  225. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/llm/best_practice_augmenter.py +0 -0
  226. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/llm/criteria_expander.py +0 -0
  227. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/llm/design_doc_extractor.py +0 -0
  228. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/llm/impl_step_deriver.py +0 -0
  229. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/llm/means_catalog_loader.py +0 -0
  230. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/llm/parser.py +0 -0
  231. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/llm/plan_deriver.py +0 -0
  232. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/llm/prompt_builder.py +0 -0
  233. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/llm/strategy_validator.py +0 -0
  234. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/llm/templates/best_practice_augment_meta.md +0 -0
  235. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/llm/templates/criteria_expand_meta.md +0 -0
  236. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/llm/templates/design_doc_extract_meta.md +0 -0
  237. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/llm/templates/impl_step_derive_meta.md +0 -0
  238. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/llm/templates/implementation_step_catalog.yaml +0 -0
  239. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/llm/templates/meta_instruction.md +0 -0
  240. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/llm/templates/plan_derive_meta.md +0 -0
  241. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/llm/templates/verification_means_catalog.yaml +0 -0
  242. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/mcp_server.py +0 -0
  243. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/measure.py +0 -0
  244. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/operational_e2e_audit.py +0 -0
  245. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/operations_derive.py +0 -0
  246. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/parsing/__init__.py +0 -0
  247. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/parsing/_shared.py +0 -0
  248. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/parsing/api_specs.py +0 -0
  249. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/parsing/extractor_registry.py +0 -0
  250. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/parsing/filesystem_routes.py +0 -0
  251. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/parsing/iac.py +0 -0
  252. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/parsing/python_ast.py +0 -0
  253. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/parsing/regex_strategies.py +0 -0
  254. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/parsing/schemas.py +0 -0
  255. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/parsing/tests_builddeps.py +0 -0
  256. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/parsing/treesitter.py +0 -0
  257. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/planner.py +0 -0
  258. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/policy.py +0 -0
  259. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/preflight/__init__.py +0 -0
  260. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/preflight/defaults/cli.yaml +0 -0
  261. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/preflight/defaults/generic.yaml +0 -0
  262. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/preflight/defaults/iot.yaml +0 -0
  263. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/preflight/defaults/mobile.yaml +0 -0
  264. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/preflight/defaults/web.yaml +0 -0
  265. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/project_types.py +0 -0
  266. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/propagate.py +0 -0
  267. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/propagation_common.py +0 -0
  268. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/propagator.py +0 -0
  269. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/reconciliation_ledger.py +0 -0
  270. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/reference_resolution.py +0 -0
  271. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/registry.py +0 -0
  272. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/repair/__init__.py +0 -0
  273. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/repair/approval_repair.py +0 -0
  274. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/repair/auto_scope_guard.py +0 -0
  275. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/repair/engine.py +0 -0
  276. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/repair/git_patcher.py +0 -0
  277. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/repair/history.py +0 -0
  278. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/repair/llm_repair_engine.py +0 -0
  279. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/repair/loop.py +0 -0
  280. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/repair/primary_picker.py +0 -0
  281. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/repair/proof_breaks.py +0 -0
  282. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/repair/repair_result.py +0 -0
  283. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/repair/repairability_classifier.py +0 -0
  284. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/repair/schema.py +0 -0
  285. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/repair/templates/analyze_meta.md +0 -0
  286. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/repair/templates/propose_meta.md +0 -0
  287. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/repair/templates/repair_strategy_meta.md +0 -0
  288. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/repair/templates/repairability_meta.md +0 -0
  289. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/repair/test_failure_attribution.py +0 -0
  290. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/repair/verify_runner.py +0 -0
  291. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/repair_slice.py +0 -0
  292. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/require.py +0 -0
  293. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/require_plugins.py +0 -0
  294. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/require_propagate.py +0 -0
  295. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/required_artifacts/defaults/cli.yaml +0 -0
  296. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/required_artifacts/defaults/generic.yaml +0 -0
  297. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/required_artifacts/defaults/iot.yaml +0 -0
  298. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/required_artifacts/defaults/mobile.yaml +0 -0
  299. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/required_artifacts/defaults/web.yaml +0 -0
  300. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/required_artifacts_deriver.py +0 -0
  301. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/requirement_completeness/defaults/cli.yaml +0 -0
  302. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/requirement_completeness/defaults/generic.yaml +0 -0
  303. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/requirement_completeness/defaults/iot.yaml +0 -0
  304. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/requirement_completeness/defaults/mobile.yaml +0 -0
  305. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/requirement_completeness/defaults/web.yaml +0 -0
  306. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/requirement_completeness_auditor.py +0 -0
  307. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/requirement_reconciliation.py +0 -0
  308. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/requirements_meta.py +0 -0
  309. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/restoration_report.py +0 -0
  310. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/restore.py +0 -0
  311. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/routes_extractor.py +0 -0
  312. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/runtime_smoke/__init__.py +0 -0
  313. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/runtime_smoke/checks.py +0 -0
  314. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/runtime_smoke/config.py +0 -0
  315. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/runtime_smoke/report.py +0 -0
  316. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/runtime_smoke/runner.py +0 -0
  317. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/scanner.py +0 -0
  318. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/schema_refs.py +0 -0
  319. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/screen_flow_validator.py +0 -0
  320. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/screen_transition_extractor.py +0 -0
  321. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/screen_transitions/defaults.yaml +0 -0
  322. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/skills_cli/__init__.py +0 -0
  323. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/skills_cli/discovery.py +0 -0
  324. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/skills_cli/manager.py +0 -0
  325. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/skills_cli/paths.py +0 -0
  326. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/stack/__init__.py +0 -0
  327. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/stack/adapters/__init__.py +0 -0
  328. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/stack/adapters/_base.py +0 -0
  329. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/stack/adapters/nextjs.py +0 -0
  330. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/stack/adapters/playwright.py +0 -0
  331. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/stack/compose.py +0 -0
  332. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/stack/loader.py +0 -0
  333. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/stack/obligations.py +0 -0
  334. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/stack/profile.py +0 -0
  335. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/stack/profiles/addons/playwright.yaml +0 -0
  336. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/stack/profiles/addons/prisma.yaml +0 -0
  337. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/stack/profiles/frameworks/nextjs.yaml +0 -0
  338. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/stack/project.py +0 -0
  339. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/stack/registry.py +0 -0
  340. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/stack/resolve.py +0 -0
  341. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/surface_reconciliation.py +0 -0
  342. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/synth.py +0 -0
  343. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/templates/codd.yaml.tmpl +0 -0
  344. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/templates/conventions.yaml.tmpl +0 -0
  345. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/templates/data_dependencies.yaml.tmpl +0 -0
  346. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/templates/doc_links.yaml.tmpl +0 -0
  347. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/templates/extract_ai_prompt_baseline.md +0 -0
  348. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/templates/extracted/api-contract.md.j2 +0 -0
  349. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/templates/extracted/architecture-overview.md.j2 +0 -0
  350. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/templates/extracted/module-detail.md.j2 +0 -0
  351. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/templates/extracted/schema-design.md.j2 +0 -0
  352. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/templates/extracted/system-context.md.j2 +0 -0
  353. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/templates/gitignore.tmpl +0 -0
  354. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/templates/lexicon_questions.md +0 -0
  355. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/templates/lexicon_schema.yaml +0 -0
  356. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/templates/overrides.yaml.tmpl +0 -0
  357. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/test_detection.py +0 -0
  358. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/test_import_coherence.py +0 -0
  359. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/traceability.py +0 -0
  360. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/validator.py +0 -0
  361. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/vb_marker_authenticity.py +0 -0
  362. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/vb_rerun_scope.py +0 -0
  363. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/verifiable_behavior_audit.py +0 -0
  364. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/watch/__init__.py +0 -0
  365. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/watch/events.py +0 -0
  366. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/watch/propagation_log.py +0 -0
  367. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/watch/propagation_pipeline.py +0 -0
  368. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/watch/test_runner.py +0 -0
  369. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/watch/watcher.py +0 -0
  370. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd/wiring.py +0 -0
  371. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/ai_governance_eu_act/coverage_matrix.md +0 -0
  372. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/ai_governance_eu_act/elicit_extend.md +0 -0
  373. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/ai_governance_eu_act/lexicon.yaml +0 -0
  374. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/ai_governance_eu_act/manifest.yaml +0 -0
  375. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/ai_governance_eu_act/recommended_kinds.yaml +0 -0
  376. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/ai_governance_eu_act/severity_rules.yaml +0 -0
  377. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/api_rate_limiting_caching/coverage_matrix.md +0 -0
  378. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/api_rate_limiting_caching/elicit_extend.md +0 -0
  379. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/api_rate_limiting_caching/lexicon.yaml +0 -0
  380. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/api_rate_limiting_caching/manifest.yaml +0 -0
  381. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/api_rate_limiting_caching/recommended_kinds.yaml +0 -0
  382. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/api_rate_limiting_caching/severity_rules.yaml +0 -0
  383. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/api_rest_openapi/coverage_matrix.md +0 -0
  384. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/api_rest_openapi/elicit_extend.md +0 -0
  385. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/api_rest_openapi/lexicon.yaml +0 -0
  386. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/api_rest_openapi/manifest.yaml +0 -0
  387. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/api_rest_openapi/recommended_kinds.yaml +0 -0
  388. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/api_rest_openapi/severity_rules.yaml +0 -0
  389. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/babok/elicit_extend.md +0 -0
  390. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/babok/lexicon.yaml +0 -0
  391. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/babok/manifest.yaml +0 -0
  392. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/babok/recommended_kinds.yaml +0 -0
  393. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/babok/severity_rules.yaml +0 -0
  394. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/backend_event_cloudevents/coverage_matrix.md +0 -0
  395. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/backend_event_cloudevents/elicit_extend.md +0 -0
  396. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/backend_event_cloudevents/lexicon.yaml +0 -0
  397. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/backend_event_cloudevents/manifest.yaml +0 -0
  398. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/backend_event_cloudevents/recommended_kinds.yaml +0 -0
  399. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/backend_event_cloudevents/severity_rules.yaml +0 -0
  400. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/backend_graphql/coverage_matrix.md +0 -0
  401. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/backend_graphql/elicit_extend.md +0 -0
  402. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/backend_graphql/lexicon.yaml +0 -0
  403. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/backend_graphql/manifest.yaml +0 -0
  404. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/backend_graphql/recommended_kinds.yaml +0 -0
  405. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/backend_graphql/severity_rules.yaml +0 -0
  406. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/backend_grpc_proto/coverage_matrix.md +0 -0
  407. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/backend_grpc_proto/elicit_extend.md +0 -0
  408. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/backend_grpc_proto/lexicon.yaml +0 -0
  409. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/backend_grpc_proto/manifest.yaml +0 -0
  410. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/backend_grpc_proto/recommended_kinds.yaml +0 -0
  411. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/backend_grpc_proto/severity_rules.yaml +0 -0
  412. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/compliance_hipaa/coverage_matrix.md +0 -0
  413. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/compliance_hipaa/elicit_extend.md +0 -0
  414. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/compliance_hipaa/lexicon.yaml +0 -0
  415. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/compliance_hipaa/manifest.yaml +0 -0
  416. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/compliance_hipaa/recommended_kinds.yaml +0 -0
  417. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/compliance_hipaa/severity_rules.yaml +0 -0
  418. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/compliance_iso27001/coverage_matrix.md +0 -0
  419. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/compliance_iso27001/elicit_extend.md +0 -0
  420. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/compliance_iso27001/lexicon.yaml +0 -0
  421. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/compliance_iso27001/manifest.yaml +0 -0
  422. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/compliance_iso27001/recommended_kinds.yaml +0 -0
  423. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/compliance_iso27001/severity_rules.yaml +0 -0
  424. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/compliance_pci_dss_4/coverage_matrix.md +0 -0
  425. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/compliance_pci_dss_4/elicit_extend.md +0 -0
  426. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/compliance_pci_dss_4/lexicon.yaml +0 -0
  427. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/compliance_pci_dss_4/manifest.yaml +0 -0
  428. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/compliance_pci_dss_4/recommended_kinds.yaml +0 -0
  429. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/compliance_pci_dss_4/severity_rules.yaml +0 -0
  430. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/data_aggregation_policies/coverage_matrix.md +0 -0
  431. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/data_aggregation_policies/elicit_extend.md +0 -0
  432. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/data_aggregation_policies/lexicon.yaml +0 -0
  433. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/data_aggregation_policies/manifest.yaml +0 -0
  434. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/data_aggregation_policies/recommended_kinds.yaml +0 -0
  435. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/data_aggregation_policies/severity_rules.yaml +0 -0
  436. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/coverage_matrix.md +0 -0
  437. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/elicit_extend.md +0 -0
  438. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/lexicon.yaml +0 -0
  439. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/manifest.yaml +0 -0
  440. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/recommended_kinds.yaml +0 -0
  441. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/severity_rules.yaml +0 -0
  442. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/data_governance_appi_gdpr/coverage_matrix.md +0 -0
  443. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/data_governance_appi_gdpr/elicit_extend.md +0 -0
  444. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/data_governance_appi_gdpr/lexicon.yaml +0 -0
  445. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/data_governance_appi_gdpr/manifest.yaml +0 -0
  446. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/data_governance_appi_gdpr/recommended_kinds.yaml +0 -0
  447. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/data_governance_appi_gdpr/severity_rules.yaml +0 -0
  448. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/data_nosql_jsonschema/coverage_matrix.md +0 -0
  449. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/data_nosql_jsonschema/elicit_extend.md +0 -0
  450. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/data_nosql_jsonschema/lexicon.yaml +0 -0
  451. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/data_nosql_jsonschema/manifest.yaml +0 -0
  452. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/data_nosql_jsonschema/recommended_kinds.yaml +0 -0
  453. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/data_nosql_jsonschema/severity_rules.yaml +0 -0
  454. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/data_relational_iso_sql/coverage_matrix.md +0 -0
  455. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/data_relational_iso_sql/elicit_extend.md +0 -0
  456. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/data_relational_iso_sql/lexicon.yaml +0 -0
  457. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/data_relational_iso_sql/manifest.yaml +0 -0
  458. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/data_relational_iso_sql/recommended_kinds.yaml +0 -0
  459. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/data_relational_iso_sql/severity_rules.yaml +0 -0
  460. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/ddd_domain_driven_design/coverage_matrix.md +0 -0
  461. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/ddd_domain_driven_design/elicit_extend.md +0 -0
  462. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/ddd_domain_driven_design/lexicon.yaml +0 -0
  463. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/ddd_domain_driven_design/manifest.yaml +0 -0
  464. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/ddd_domain_driven_design/recommended_kinds.yaml +0 -0
  465. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/ddd_domain_driven_design/severity_rules.yaml +0 -0
  466. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/dora_sre_metrics/coverage_matrix.md +0 -0
  467. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/dora_sre_metrics/elicit_extend.md +0 -0
  468. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/dora_sre_metrics/lexicon.yaml +0 -0
  469. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/dora_sre_metrics/manifest.yaml +0 -0
  470. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/dora_sre_metrics/recommended_kinds.yaml +0 -0
  471. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/dora_sre_metrics/severity_rules.yaml +0 -0
  472. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/i18n_unicode_cldr/coverage_matrix.md +0 -0
  473. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/i18n_unicode_cldr/elicit_extend.md +0 -0
  474. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/i18n_unicode_cldr/lexicon.yaml +0 -0
  475. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/i18n_unicode_cldr/manifest.yaml +0 -0
  476. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/i18n_unicode_cldr/recommended_kinds.yaml +0 -0
  477. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/i18n_unicode_cldr/severity_rules.yaml +0 -0
  478. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/ml_model_cards/coverage_matrix.md +0 -0
  479. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/ml_model_cards/elicit_extend.md +0 -0
  480. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/ml_model_cards/lexicon.yaml +0 -0
  481. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/ml_model_cards/manifest.yaml +0 -0
  482. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/ml_model_cards/recommended_kinds.yaml +0 -0
  483. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/ml_model_cards/severity_rules.yaml +0 -0
  484. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/mobile_a11y_native/coverage_matrix.md +0 -0
  485. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/mobile_a11y_native/elicit_extend.md +0 -0
  486. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/mobile_a11y_native/lexicon.yaml +0 -0
  487. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/mobile_a11y_native/manifest.yaml +0 -0
  488. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/mobile_a11y_native/recommended_kinds.yaml +0 -0
  489. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/mobile_a11y_native/severity_rules.yaml +0 -0
  490. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/mobile_android_material3/coverage_matrix.md +0 -0
  491. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/mobile_android_material3/elicit_extend.md +0 -0
  492. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/mobile_android_material3/lexicon.yaml +0 -0
  493. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/mobile_android_material3/manifest.yaml +0 -0
  494. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/mobile_android_material3/recommended_kinds.yaml +0 -0
  495. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/mobile_android_material3/severity_rules.yaml +0 -0
  496. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/mobile_ios_hig/coverage_matrix.md +0 -0
  497. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/mobile_ios_hig/elicit_extend.md +0 -0
  498. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/mobile_ios_hig/lexicon.yaml +0 -0
  499. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/mobile_ios_hig/manifest.yaml +0 -0
  500. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/mobile_ios_hig/recommended_kinds.yaml +0 -0
  501. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/mobile_ios_hig/severity_rules.yaml +0 -0
  502. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/mobile_security_masvs/coverage_matrix.md +0 -0
  503. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/mobile_security_masvs/elicit_extend.md +0 -0
  504. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/mobile_security_masvs/lexicon.yaml +0 -0
  505. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/mobile_security_masvs/manifest.yaml +0 -0
  506. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/mobile_security_masvs/recommended_kinds.yaml +0 -0
  507. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/mobile_security_masvs/severity_rules.yaml +0 -0
  508. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/ops_cicd_pipeline/coverage_matrix.md +0 -0
  509. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/ops_cicd_pipeline/elicit_extend.md +0 -0
  510. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/ops_cicd_pipeline/lexicon.yaml +0 -0
  511. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/ops_cicd_pipeline/manifest.yaml +0 -0
  512. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/ops_cicd_pipeline/recommended_kinds.yaml +0 -0
  513. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/ops_cicd_pipeline/severity_rules.yaml +0 -0
  514. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/ops_iac_terraform/coverage_matrix.md +0 -0
  515. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/ops_iac_terraform/elicit_extend.md +0 -0
  516. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/ops_iac_terraform/lexicon.yaml +0 -0
  517. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/ops_iac_terraform/manifest.yaml +0 -0
  518. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/ops_iac_terraform/recommended_kinds.yaml +0 -0
  519. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/ops_iac_terraform/severity_rules.yaml +0 -0
  520. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/ops_kubernetes/coverage_matrix.md +0 -0
  521. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/ops_kubernetes/elicit_extend.md +0 -0
  522. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/ops_kubernetes/lexicon.yaml +0 -0
  523. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/ops_kubernetes/manifest.yaml +0 -0
  524. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/ops_kubernetes/recommended_kinds.yaml +0 -0
  525. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/ops_kubernetes/severity_rules.yaml +0 -0
  526. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/ops_observability_otel/coverage_matrix.md +0 -0
  527. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/ops_observability_otel/elicit_extend.md +0 -0
  528. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/ops_observability_otel/lexicon.yaml +0 -0
  529. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/ops_observability_otel/manifest.yaml +0 -0
  530. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/ops_observability_otel/recommended_kinds.yaml +0 -0
  531. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/ops_observability_otel/severity_rules.yaml +0 -0
  532. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/process_iso25010/coverage_matrix.md +0 -0
  533. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/process_iso25010/elicit_extend.md +0 -0
  534. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/process_iso25010/lexicon.yaml +0 -0
  535. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/process_iso25010/manifest.yaml +0 -0
  536. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/process_iso25010/recommended_kinds.yaml +0 -0
  537. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/process_iso25010/severity_rules.yaml +0 -0
  538. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/process_test_iso29119/coverage_matrix.md +0 -0
  539. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/process_test_iso29119/elicit_extend.md +0 -0
  540. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/process_test_iso29119/lexicon.yaml +0 -0
  541. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/process_test_iso29119/manifest.yaml +0 -0
  542. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/process_test_iso29119/recommended_kinds.yaml +0 -0
  543. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/process_test_iso29119/severity_rules.yaml +0 -0
  544. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/twelve_factor_app/coverage_matrix.md +0 -0
  545. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/twelve_factor_app/elicit_extend.md +0 -0
  546. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/twelve_factor_app/lexicon.yaml +0 -0
  547. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/twelve_factor_app/manifest.yaml +0 -0
  548. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/twelve_factor_app/recommended_kinds.yaml +0 -0
  549. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/twelve_factor_app/severity_rules.yaml +0 -0
  550. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/coverage_matrix.md +0 -0
  551. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/elicit_extend.md +0 -0
  552. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/lexicon.yaml +0 -0
  553. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/manifest.yaml +0 -0
  554. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/recommended_kinds.yaml +0 -0
  555. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/severity_rules.yaml +0 -0
  556. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/web_authn_webauthn/coverage_matrix.md +0 -0
  557. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/web_authn_webauthn/elicit_extend.md +0 -0
  558. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/web_authn_webauthn/lexicon.yaml +0 -0
  559. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/web_authn_webauthn/manifest.yaml +0 -0
  560. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/web_authn_webauthn/recommended_kinds.yaml +0 -0
  561. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/web_authn_webauthn/severity_rules.yaml +0 -0
  562. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/web_browser_compat/coverage_matrix.md +0 -0
  563. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/web_browser_compat/elicit_extend.md +0 -0
  564. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/web_browser_compat/lexicon.yaml +0 -0
  565. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/web_browser_compat/manifest.yaml +0 -0
  566. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/web_browser_compat/recommended_kinds.yaml +0 -0
  567. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/web_browser_compat/severity_rules.yaml +0 -0
  568. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/web_forms_html5/coverage_matrix.md +0 -0
  569. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/web_forms_html5/elicit_extend.md +0 -0
  570. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/web_forms_html5/lexicon.yaml +0 -0
  571. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/web_forms_html5/manifest.yaml +0 -0
  572. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/web_forms_html5/recommended_kinds.yaml +0 -0
  573. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/web_forms_html5/severity_rules.yaml +0 -0
  574. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/web_performance_core_web_vitals/coverage_matrix.md +0 -0
  575. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/web_performance_core_web_vitals/elicit_extend.md +0 -0
  576. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/web_performance_core_web_vitals/lexicon.yaml +0 -0
  577. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/web_performance_core_web_vitals/manifest.yaml +0 -0
  578. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/web_performance_core_web_vitals/recommended_kinds.yaml +0 -0
  579. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/web_performance_core_web_vitals/severity_rules.yaml +0 -0
  580. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/web_pwa_manifest/coverage_matrix.md +0 -0
  581. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/web_pwa_manifest/elicit_extend.md +0 -0
  582. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/web_pwa_manifest/lexicon.yaml +0 -0
  583. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/web_pwa_manifest/manifest.yaml +0 -0
  584. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/web_pwa_manifest/recommended_kinds.yaml +0 -0
  585. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/web_pwa_manifest/severity_rules.yaml +0 -0
  586. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/web_responsive/coverage_matrix.md +0 -0
  587. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/web_responsive/elicit_extend.md +0 -0
  588. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/web_responsive/lexicon.yaml +0 -0
  589. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/web_responsive/manifest.yaml +0 -0
  590. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/web_responsive/recommended_kinds.yaml +0 -0
  591. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/web_responsive/severity_rules.yaml +0 -0
  592. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/web_security_owasp/coverage_matrix.md +0 -0
  593. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/web_security_owasp/elicit_extend.md +0 -0
  594. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/web_security_owasp/lexicon.yaml +0 -0
  595. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/web_security_owasp/manifest.yaml +0 -0
  596. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/web_security_owasp/recommended_kinds.yaml +0 -0
  597. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/web_security_owasp/severity_rules.yaml +0 -0
  598. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/web_seo_schemaorg/coverage_matrix.md +0 -0
  599. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/web_seo_schemaorg/elicit_extend.md +0 -0
  600. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/web_seo_schemaorg/lexicon.yaml +0 -0
  601. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/web_seo_schemaorg/manifest.yaml +0 -0
  602. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/web_seo_schemaorg/recommended_kinds.yaml +0 -0
  603. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/lexicons/web_seo_schemaorg/severity_rules.yaml +0 -0
  604. {codd_dev-2.89.0 → codd_dev-2.90.0}/codd_plugins/stack_map.yaml +0 -0
  605. {codd_dev-2.89.0 → codd_dev-2.90.0}/docs/cookbook/cdp_browser/README.md +0 -0
  606. {codd_dev-2.89.0 → codd_dev-2.90.0}/docs/cookbook/presentation_aggregation/README.md +0 -0
  607. {codd_dev-2.89.0 → codd_dev-2.90.0}/docs/requirements/README.md +0 -0
  608. {codd_dev-2.89.0 → codd_dev-2.90.0}/dogfood/README.md +0 -0
  609. {codd_dev-2.89.0 → codd_dev-2.90.0}/dogfood/fixtures/flat_py_app/README.md +0 -0
  610. {codd_dev-2.89.0 → codd_dev-2.90.0}/examples/README.md +0 -0
  611. {codd_dev-2.89.0 → codd_dev-2.90.0}/skills/codd-assemble/SKILL.md +0 -0
  612. {codd_dev-2.89.0 → codd_dev-2.90.0}/skills/codd-evolve/SKILL.md +0 -0
  613. {codd_dev-2.89.0 → codd_dev-2.90.0}/skills/codd-generate/SKILL.md +0 -0
  614. {codd_dev-2.89.0 → codd_dev-2.90.0}/skills/codd-greenfield/SKILL.md +0 -0
  615. {codd_dev-2.89.0 → codd_dev-2.90.0}/skills/codd-impact/SKILL.md +0 -0
  616. {codd_dev-2.89.0 → codd_dev-2.90.0}/skills/codd-init/SKILL.md +0 -0
  617. {codd_dev-2.89.0 → codd_dev-2.90.0}/skills/codd-propagate/SKILL.md +0 -0
  618. {codd_dev-2.89.0 → codd_dev-2.90.0}/skills/codd-restore/SKILL.md +0 -0
  619. {codd_dev-2.89.0 → codd_dev-2.90.0}/skills/codd-scan/SKILL.md +0 -0
  620. {codd_dev-2.89.0 → codd_dev-2.90.0}/skills/codd-validate/SKILL.md +0 -0
  621. {codd_dev-2.89.0 → codd_dev-2.90.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.89.0
3
+ Version: 2.90.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.89.0"
3
+ __version__ = "2.90.0"
@@ -5023,11 +5023,13 @@ def verify(
5023
5023
  if not runtime:
5024
5024
  return
5025
5025
 
5026
- # Stack contract intake (Contract Kernel v2.77a) — bring the project's declared
5027
- # framework-stack contract into the live verify run's trace, mirroring the
5028
- # greenfield intake. INTAKE ONLY: no obligation is enforced and NO verdict
5029
- # changes (that is v2.77b-e). A project with no `stack:` block is unaffected; a
5030
- # declared-but-broken stack fails HONESTLY (anti-false-green), never a silent skip.
5026
+ # Stack contract intake + lock enforcement (Contract Kernel v2.77a/v2.77b) —
5027
+ # bring the project's declared framework-stack contract into the live verify
5028
+ # run's trace (v2.77a, mirroring the greenfield intake), then ENFORCE the stack
5029
+ # lock as a gate (v2.77b): a stack project whose committed lock has drifted from
5030
+ # the resolved contract or that has no committed lock at all — is RED. A
5031
+ # project with no `stack:` block is unaffected; a declared-but-broken stack
5032
+ # fails HONESTLY (anti-false-green), never a silent skip.
5031
5033
  _intake_stack_contract_for_verify(Path(path).resolve())
5032
5034
 
5033
5035
  verify_kwargs: dict[str, Any] = {"path": path, "prefer_standalone": True}
@@ -7627,6 +7629,15 @@ def _intake_stack_contract_for_verify(project_root: Path) -> None:
7627
7629
  raise SystemExit(1) from exc
7628
7630
 
7629
7631
  if contract is None:
7632
+ # No `stack:` block → byte-identical, UNLESS a committed lock still exists
7633
+ # (a removed stack declaration on a still-pinned project = RED; closes the
7634
+ # "drop stack: to dodge the gate" bypass — v2.77b anti-false-green).
7635
+ from codd.stack.lock import orphan_stack_lock
7636
+
7637
+ orphan = orphan_stack_lock(project_root)
7638
+ if orphan is not None and orphan.red:
7639
+ click.echo(f"[verify] stack lock gate: {orphan.message}", err=True)
7640
+ raise SystemExit(1)
7630
7641
  return
7631
7642
  trace = stack_contract_trace(contract)
7632
7643
  click.echo(
@@ -7634,6 +7645,19 @@ def _intake_stack_contract_for_verify(project_root: Path) -> None:
7634
7645
  f"stack_contract_hash={trace['stack_contract_hash']}"
7635
7646
  )
7636
7647
 
7648
+ # Stack lock ENFORCEMENT (Contract Kernel v2.77b) — verify is always an
7649
+ # enforcement context (it never CREATES a project), so it uses the strictly
7650
+ # READ-ONLY gate: a stack project with no committed lock, or a lock that has
7651
+ # drifted from (or cannot be parsed against) the resolved contract, is RED
7652
+ # (honest non-zero exit). The gate never writes or refreshes the lock, so a
7653
+ # drift cannot be silenced on the verify path.
7654
+ from codd.stack.lock import enforce_stack_lock
7655
+
7656
+ gate = enforce_stack_lock(contract, project_root)
7657
+ click.echo(f"[verify] stack lock gate: {gate.message}", err=gate.red)
7658
+ if gate.red:
7659
+ raise SystemExit(1)
7660
+
7637
7661
 
7638
7662
  def _run_verify_once(
7639
7663
  path: str,
@@ -452,14 +452,54 @@ class GreenfieldPipeline:
452
452
  # failed GreenfieldResult instead of raising to the caller. Its own
453
453
  # pseudo-stage name (not a real STAGES entry) so the failure is attributed
454
454
  # honestly to intake, not to ``init``.
455
+ # Whether THIS run is a genuine first generation (the project is being
456
+ # created now) vs a re-run/resume of an already-progressed project. This is
457
+ # the ONLY context in which the stack-lock gate may bootstrap a missing lock
458
+ # (anti-gaming). It is read from the ON-DISK session INDEPENDENTLY of the
459
+ # ``resume`` flag — because a re-run WITHOUT ``--resume`` builds a fresh
460
+ # in-memory ``session`` (all-pending), which must NOT be mistaken for a first
461
+ # generation on an already-built project (GPT-consult leak: "absence of
462
+ # session ≠ first generation"). Fail-closed: any persisted completed stage ⇒
463
+ # not first-gen, so a deleted lock on a built project is RED, never silently
464
+ # re-bootstrapped to green.
465
+ on_disk = load_session(project_root)
466
+ first_generation = on_disk is None or not any(
467
+ rec.get("status") in _COMPLETE_STATUSES
468
+ for rec in on_disk.get("stages", {}).values()
469
+ )
470
+
455
471
  try:
456
- self._intake_stack_contract(project_root, session)
472
+ contract = self._intake_stack_contract(project_root, session)
457
473
  except StageError as exc:
458
474
  return self._fail(
459
475
  project_root, session, options, "stack_intake",
460
476
  {"status": STATUS_PENDING, "detail": ""}, str(exc),
461
477
  )
462
478
 
479
+ # Stack lock ENFORCEMENT (Contract Kernel v2.77b) — turn the already-live
480
+ # stack contract into a red/green GATE. For stack-declared projects
481
+ # (contract is not None): drift / missing-in-resume = RED (anti-false-green);
482
+ # a first-generation missing lock is bootstrapped once (never overwritten —
483
+ # anti-gaming). For projects with NO stack block: byte-identical UNLESS a
484
+ # committed lock still exists (a removed declaration on a still-pinned
485
+ # project = RED, closing the "drop stack: to dodge the gate" bypass).
486
+ # Routed through _fail like intake so the autopilot reports it honestly.
487
+ try:
488
+ if contract is not None:
489
+ self._enforce_stack_lock(project_root, session, contract, first_generation)
490
+ else:
491
+ from codd.stack.lock import orphan_stack_lock
492
+
493
+ orphan = orphan_stack_lock(project_root)
494
+ if orphan is not None and orphan.red:
495
+ self.echo(f"[greenfield] stack lock gate: {orphan.message}")
496
+ raise StageError(orphan.message)
497
+ except StageError as exc:
498
+ return self._fail(
499
+ project_root, session, options, "stack_lock",
500
+ {"status": STATUS_PENDING, "detail": ""}, str(exc),
501
+ )
502
+
463
503
  runners: dict[str, Callable[[Path, dict[str, Any], dict[str, Any]], None]] = {
464
504
  "init": self._stage_init,
465
505
  "elicit": self._stage_elicit,
@@ -544,7 +584,7 @@ class GreenfieldPipeline:
544
584
 
545
585
  # ── stack contract intake (Contract Kernel v2.77a, intake only) ──
546
586
 
547
- def _intake_stack_contract(self, project_root: Path, session: dict[str, Any]) -> None:
587
+ def _intake_stack_contract(self, project_root: Path, session: dict[str, Any]):
548
588
  """Resolve the project's declared stack contract into the live run record + trace.
549
589
 
550
590
  See the call site in :meth:`run`. INTAKE ONLY — proves the framework-stack
@@ -554,10 +594,11 @@ class GreenfieldPipeline:
554
594
 
555
595
  * No ``stack:`` block → no-op: nothing is added to the record and only a
556
596
  single debug ``self.echo`` is emitted, so a non-stack project (the vast
557
- majority) is behaviour-preserving.
597
+ majority) is behaviour-preserving. Returns ``None``.
558
598
  * A declared stack → its :func:`stack_contract_trace` payload (incl.
559
599
  ``stack_contract_hash``) is written to ``session["stack_contract"]`` and
560
- echoed to the run trace.
600
+ echoed to the run trace. Returns the resolved ``ResolvedStackContract`` so
601
+ the v2.77b lock-enforcement gate (run after intake) can pin it.
561
602
  * A declared-but-BROKEN stack → :class:`StageError` (honest error), never a
562
603
  silent skip (anti-false-green / no-silent-fallback).
563
604
  """
@@ -577,7 +618,7 @@ class GreenfieldPipeline:
577
618
  if contract is None:
578
619
  # The opt-in framework layer is unused — byte-identical behaviour.
579
620
  self.echo("[greenfield] stack contract intake: no `stack:` block (framework layer opt-out)")
580
- return
621
+ return None
581
622
 
582
623
  trace = stack_contract_trace(contract)
583
624
  session["stack_contract"] = dict(trace)
@@ -586,6 +627,45 @@ class GreenfieldPipeline:
586
627
  f"{trace['resolved_stack_id']} "
587
628
  f"stack_contract_hash={trace['stack_contract_hash']}"
588
629
  )
630
+ return contract
631
+
632
+ # ── stack lock enforcement (Contract Kernel v2.77b) ──
633
+
634
+ def _enforce_stack_lock(self, project_root: Path, session: dict[str, Any], contract, first_generation: bool) -> None:
635
+ """Enforce the project's stack lock as a red/green gate (v2.77b).
636
+
637
+ Only called for stack-declared projects (``contract is not None``); non-stack
638
+ projects never reach here, so they are byte-identical (no lock gate at all).
639
+
640
+ Design B′ (split read-only gate vs. creation-path bootstrap):
641
+
642
+ * genuine FIRST GENERATION (``first_generation`` True — no prior completed
643
+ stage) → :func:`bootstrap_stack_lock` writes the first lock (exclusive
644
+ create) and immediately enforces it read-only; ``generated`` is traced.
645
+ * otherwise (RESUME / already-progressed project) → read-only
646
+ :func:`enforce_stack_lock`: a missing lock is RED (an already-progressed
647
+ stack project with no committed pin is unverifiable; a deleted lock cannot
648
+ be silently regenerated), drift is RED, a valid lock is GREEN.
649
+
650
+ Anti-gaming (exit gate 3): the read-only gate NEVER writes/refreshes a lock;
651
+ ``bootstrap_stack_lock`` writes only when the lock is ABSENT (exclusive
652
+ create) on this creation path, so a drift cannot be silenced by regenerating
653
+ the lock. See :func:`enforce_stack_lock` / :func:`bootstrap_stack_lock`.
654
+ """
655
+ from codd.stack.lock import bootstrap_stack_lock, enforce_stack_lock
656
+
657
+ if first_generation:
658
+ gate = bootstrap_stack_lock(contract, project_root)
659
+ else:
660
+ gate = enforce_stack_lock(contract, project_root)
661
+ # Record the lock verdict in the run trace (observable, like the intake hash).
662
+ record = session.get("stack_contract")
663
+ if isinstance(record, dict):
664
+ record["stack_lock_status"] = gate.status
665
+ record["stack_lock_path"] = gate.lock_path
666
+ self.echo(f"[greenfield] stack lock gate: {gate.message}")
667
+ if gate.red:
668
+ raise StageError(gate.message)
589
669
 
590
670
  # ── option resolution ───────────────────────────────────
591
671
 
@@ -0,0 +1,366 @@
1
+ """``codd.stack.lock`` — pin a resolved stack for deterministic CI (design §2/§決定性).
2
+
3
+ Auto-detection (package.json has ``next`` → use the Next.js profile) is convenient
4
+ for ``local init`` only. In CI the lock is the SOURCE OF TRUTH: the resolved
5
+ contract is recomputed and any divergence from the lock (a layer version bump, a
6
+ profile edit changing a digest, a different resolved-contract hash) is RED, so a
7
+ profile change can never silently alter a project's contract.
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ from dataclasses import dataclass, field
13
+ from pathlib import Path
14
+ from typing import Any, Mapping
15
+
16
+ import yaml
17
+
18
+ from .compose import ResolvedStackContract
19
+
20
+ #: The lock file lives next to ``codd.yaml`` inside the project's CoDD config dir
21
+ #: (so ``<project>/codd/stack.lock`` or ``<project>/.codd/stack.lock``). The
22
+ #: module docstring's ``codd.stack.lock`` is this file.
23
+ LOCK_FILENAME = "stack.lock"
24
+
25
+ LOCK_SCHEMA_VERSION = 1
26
+
27
+
28
+ @dataclass(frozen=True)
29
+ class LockedLayer:
30
+ id: str
31
+ kind: str
32
+ version: str
33
+ digest: str
34
+
35
+
36
+ @dataclass(frozen=True)
37
+ class StackLock:
38
+ schema_version: int
39
+ stack_id: str
40
+ layers: tuple[LockedLayer, ...]
41
+ resolved_contract_digest: str
42
+ adapter_digests: Mapping[str, str] = field(default_factory=dict)
43
+ permissions: Mapping[str, Any] = field(default_factory=dict)
44
+
45
+
46
+ def build_lock(
47
+ contract: ResolvedStackContract,
48
+ *,
49
+ adapter_digests: Mapping[str, str] | None = None,
50
+ permissions: Mapping[str, Any] | None = None,
51
+ ) -> StackLock:
52
+ """Derive a :class:`StackLock` from a resolved contract."""
53
+ return StackLock(
54
+ schema_version=LOCK_SCHEMA_VERSION,
55
+ stack_id=contract.stack_id,
56
+ layers=tuple(
57
+ LockedLayer(id=l.id, kind=l.kind, version=l.profile_version, digest=l.digest)
58
+ for l in contract.layers
59
+ ),
60
+ resolved_contract_digest=contract.content_hash,
61
+ adapter_digests=dict(adapter_digests or {}),
62
+ permissions=dict(permissions or {}),
63
+ )
64
+
65
+
66
+ def lock_to_dict(lock: StackLock) -> dict[str, Any]:
67
+ return {
68
+ "schema_version": lock.schema_version,
69
+ "stack_id": lock.stack_id,
70
+ "layers": [
71
+ {"id": l.id, "kind": l.kind, "version": l.version, "digest": l.digest}
72
+ for l in lock.layers
73
+ ],
74
+ "resolved_contract_digest": lock.resolved_contract_digest,
75
+ "adapter_digests": dict(lock.adapter_digests),
76
+ "permissions": dict(lock.permissions),
77
+ }
78
+
79
+
80
+ def dump_lock(lock: StackLock) -> str:
81
+ """Serialize a lock to YAML (stable key order for clean diffs)."""
82
+ return yaml.safe_dump(lock_to_dict(lock), sort_keys=True, default_flow_style=False)
83
+
84
+
85
+ def parse_lock(data: str | Mapping[str, Any]) -> StackLock:
86
+ doc = yaml.safe_load(data) if isinstance(data, str) else dict(data)
87
+ if not isinstance(doc, Mapping):
88
+ raise ValueError("codd.stack.lock must be a mapping at the top level")
89
+ layers = tuple(
90
+ LockedLayer(
91
+ id=str(l["id"]),
92
+ kind=str(l.get("kind", "")),
93
+ version=str(l.get("version", "")),
94
+ digest=str(l.get("digest", "")),
95
+ )
96
+ for l in (doc.get("layers") or [])
97
+ )
98
+ return StackLock(
99
+ schema_version=int(doc.get("schema_version", LOCK_SCHEMA_VERSION)),
100
+ stack_id=str(doc.get("stack_id", "")),
101
+ layers=layers,
102
+ resolved_contract_digest=str(doc.get("resolved_contract_digest", "")),
103
+ adapter_digests=dict(doc.get("adapter_digests") or {}),
104
+ permissions=dict(doc.get("permissions") or {}),
105
+ )
106
+
107
+
108
+ def verify_lock(contract: ResolvedStackContract, lock: StackLock) -> tuple[bool, list[str]]:
109
+ """Check a freshly-resolved contract against a pinned lock (CI gate).
110
+
111
+ Returns ``(ok, diffs)``. ``ok`` is False (CI RED) when the resolved contract
112
+ diverges from the lock — a layer set/version/digest change, or a different
113
+ resolved-contract digest (a profile edit that silently changed the contract).
114
+ """
115
+ diffs: list[str] = []
116
+ if contract.stack_id != lock.stack_id:
117
+ diffs.append(f"stack_id: contract={contract.stack_id!r} lock={lock.stack_id!r}")
118
+
119
+ contract_layers = {l.id: l for l in contract.layers}
120
+ lock_layers = {l.id: l for l in lock.layers}
121
+ for lid in sorted(set(contract_layers) | set(lock_layers)):
122
+ if lid not in contract_layers:
123
+ diffs.append(f"layer {lid!r}: in lock but not resolved")
124
+ continue
125
+ if lid not in lock_layers:
126
+ diffs.append(f"layer {lid!r}: resolved but not in lock")
127
+ continue
128
+ c, k = contract_layers[lid], lock_layers[lid]
129
+ if c.profile_version != k.version:
130
+ diffs.append(f"layer {lid!r} version: contract={c.profile_version} lock={k.version}")
131
+ if c.digest and k.digest and c.digest != k.digest:
132
+ diffs.append(f"layer {lid!r} digest changed (profile edited)")
133
+
134
+ if contract.content_hash != lock.resolved_contract_digest:
135
+ diffs.append(
136
+ "resolved_contract_digest changed "
137
+ f"(contract={contract.content_hash[:23]}… lock={lock.resolved_contract_digest[:23]}…)"
138
+ )
139
+ return (not diffs, diffs)
140
+
141
+
142
+ # ── enforcement gate (Contract Kernel v2.77b — Stack Lock Enforcement) ───────
143
+ #
144
+ # v2.77a brought the stack contract LIVE (intake-only). v2.77b turns the
145
+ # already-existing lock logic above into a GATE so stack-contract drift is RED.
146
+ #
147
+ # Anti-false-green is the entire point of this step. The design (B′, confirmed by
148
+ # a GPT-5.5 Pro consult — see the task report) SPLITS the two responsibilities so
149
+ # the gate has NO "verify-or-create" mixed semantics — the one and only thing that
150
+ # could turn a drift-RED into green:
151
+ #
152
+ # * :func:`enforce_stack_lock` is STRICTLY READ-ONLY. It NEVER writes/refreshes
153
+ # a lock. missing → RED, parse-error → RED, drift → RED, valid → GREEN. Both
154
+ # the verify path and the greenfield path call THIS for the verdict.
155
+ # * :func:`bootstrap_stack_lock` is the ONLY writer, and it uses EXCLUSIVE
156
+ # create (``open(..., "x")``): it writes only when the lock is ABSENT and is
157
+ # invoked only on a positively-identified project-creation path (greenfield
158
+ # first generation). It refuses to overwrite, so it cannot refresh a drift.
159
+ #
160
+ # ANTI-GAMING (exit gate 3, the crux): ``verify_lock(contract,
161
+ # build_lock(contract))`` is ALWAYS ok by construction — a drift can be MASKED by
162
+ # rewriting the lock to match. So the verify path can't detect gaming; the control
163
+ # is "who may WRITE a lock, and when". Here: the read-only gate writes nothing
164
+ # ever, and bootstrap writes only on exclusive-create in the creation path. A
165
+ # drift against a committed lock is RED on every path and is never refreshed by
166
+ # either function; auto-repair re-running the gate keeps seeing drift-RED.
167
+ # Refreshing a drifted lock requires an explicit out-of-band proof
168
+ # (``replace_with_proof``-style; full repair governance is v2.77f).
169
+ #
170
+ # WHY NOT "missing + absent-session ⇒ generate": absence of a session is NOT
171
+ # proof of first generation (it can be a deleted session, a copied project, an
172
+ # existing repo, or auto-repair having cleaned local state). Generation therefore
173
+ # belongs to an explicit creation path (bootstrap), and the gate fails CLOSED
174
+ # (missing = RED) everywhere else — the delete-and-regenerate attack cannot
175
+ # silence a drift because the gate never participates in regeneration.
176
+
177
+ #: ``StackLockGate.status`` values.
178
+ LOCK_OK = "ok" # a committed lock matches the resolved contract (GREEN).
179
+ LOCK_DRIFT = "drift" # a committed lock diverges / is unparseable (RED).
180
+ LOCK_MISSING = "missing" # no committed lock where one must exist (RED).
181
+ LOCK_GENERATED = "generated" # bootstrap wrote the first lock (GREEN, traced).
182
+
183
+
184
+ def stack_lock_path(project_root: str | Path) -> Path:
185
+ """Return the path of a project's stack lock file (next to ``codd.yaml``).
186
+
187
+ Resolved from the canonical project root via the same config-dir discovery as
188
+ :func:`codd.config.load_project_config` (``codd/`` then ``.codd/``), NOT from a
189
+ mutable CWD. If no config dir is discoverable yet, defaults to
190
+ ``<project_root>/codd/stack.lock`` so a first-generation greenfield run (which
191
+ has just created ``codd/``) bootstraps the lock in the canonical place.
192
+ """
193
+ from codd.config import find_codd_dir
194
+
195
+ root = Path(project_root)
196
+ codd_dir = find_codd_dir(root)
197
+ if codd_dir is None:
198
+ codd_dir = root / "codd"
199
+ return codd_dir / LOCK_FILENAME
200
+
201
+
202
+ @dataclass(frozen=True)
203
+ class StackLockGate:
204
+ """The verdict of the (read-only) stack-lock enforcement gate (v2.77b).
205
+
206
+ ``red`` is the single anti-false-green signal the pipeline/verify call-sites
207
+ act on: ``drift`` and ``missing`` are RED; ``ok`` is GREEN; ``generated`` is the
208
+ GREEN result returned right after :func:`bootstrap_stack_lock` writes the first
209
+ lock. ``reasons`` carry the human-readable drift diffs.
210
+ """
211
+
212
+ status: str
213
+ red: bool
214
+ reasons: tuple[str, ...] = ()
215
+ lock_path: str = ""
216
+
217
+ @property
218
+ def message(self) -> str:
219
+ if self.status == LOCK_OK:
220
+ return f"stack lock OK ({self.lock_path})"
221
+ if self.status == LOCK_GENERATED:
222
+ return f"stack lock generated (first generation) at {self.lock_path}"
223
+ if self.status == LOCK_MISSING:
224
+ return (
225
+ f"stack lock MISSING at {self.lock_path}: a project that declares a "
226
+ "`stack:` block must commit a stack lock — an unpinned stack contract is "
227
+ "unverifiable (anti-false-green). It is generated once on a first "
228
+ "`codd greenfield` run; the enforcement gate is read-only and will never "
229
+ "silently create it (a missing lock outside first generation is RED, so a "
230
+ "deleted lock cannot be silently regenerated to green)."
231
+ )
232
+ # drift (incl. present-but-unparseable lock)
233
+ joined = "; ".join(self.reasons) if self.reasons else "resolved contract diverges from the lock"
234
+ return (
235
+ f"stack lock DRIFT ({self.lock_path}): the resolved stack contract no longer "
236
+ f"matches the committed lock [{joined}]. This is RED. Rewriting the lock to "
237
+ "match does NOT clear this — the gate is read-only and never refreshes a lock; "
238
+ "a drift requires reverting the contract change or an explicit proof-backed "
239
+ "lock update (replace_with_proof)."
240
+ )
241
+
242
+
243
+ def enforce_stack_lock(
244
+ contract: ResolvedStackContract, project_root: str | Path
245
+ ) -> StackLockGate:
246
+ """Read-only stack-lock gate for a resolved contract (the v2.77b enforcement).
247
+
248
+ ``contract`` is the freshly-resolved :class:`ResolvedStackContract` (the caller
249
+ has already intaken it — v2.77a). This function reads the project's committed
250
+ lock and returns a verdict; it NEVER writes or refreshes the lock (so it cannot
251
+ turn a drift-RED into green — exit gate 3):
252
+
253
+ * **missing** — no committed lock → ``red=True`` (``status=missing``). A stack
254
+ project with no pin is unverifiable; generation is the separate
255
+ :func:`bootstrap_stack_lock` responsibility (creation path only).
256
+ * **parse error** — a present-but-unparseable lock → ``red=True``
257
+ (``status=drift``). A broken lock is NEVER treated as "missing" (which could
258
+ invite regeneration).
259
+ * **drift** — a committed lock exists but :func:`verify_lock` reports
260
+ divergence → ``red=True`` (``status=drift``).
261
+ * **valid** — a committed lock matches → ``status=ok``, ``red=False``.
262
+ """
263
+ path = stack_lock_path(project_root)
264
+ path_str = str(path)
265
+
266
+ if not path.exists():
267
+ return StackLockGate(status=LOCK_MISSING, red=True, lock_path=path_str)
268
+
269
+ try:
270
+ lock = parse_lock(path.read_text(encoding="utf-8"))
271
+ except Exception as exc: # noqa: BLE001 — any read/parse failure is RED, never "missing".
272
+ # A present-but-unreadable/corrupt lock is NOT a pass and is NOT "missing"
273
+ # (which could invite regeneration): it is drift (RED).
274
+ return StackLockGate(
275
+ status=LOCK_DRIFT,
276
+ red=True,
277
+ reasons=(f"lock file present but unparseable: {type(exc).__name__}: {exc}",),
278
+ lock_path=path_str,
279
+ )
280
+
281
+ ok, diffs = verify_lock(contract, lock)
282
+ if ok:
283
+ return StackLockGate(status=LOCK_OK, red=False, lock_path=path_str)
284
+ # DRIFT — RED. Read-only: the lock is left untouched (anti-gaming, exit gate 3).
285
+ return StackLockGate(status=LOCK_DRIFT, red=True, reasons=tuple(diffs), lock_path=path_str)
286
+
287
+
288
+ def bootstrap_stack_lock(
289
+ contract: ResolvedStackContract,
290
+ project_root: str | Path,
291
+ *,
292
+ adapter_digests: Mapping[str, str] | None = None,
293
+ permissions: Mapping[str, Any] | None = None,
294
+ ) -> StackLockGate:
295
+ """Write a project's FIRST stack lock (creation path only) — the ONLY writer.
296
+
297
+ Invoked ONLY on a positively-identified project-creation path (greenfield first
298
+ generation), never by the enforcement gate, never by verify/resume, never by
299
+ repair. Uses EXCLUSIVE create (``open(..., "x")``): it writes the lock iff it is
300
+ ABSENT and refuses to overwrite an existing lock. This is what makes the
301
+ delete-and-regenerate / drift-refresh attacks impossible — bootstrap cannot
302
+ refresh a drifted (existing) lock, and a missing lock outside the creation path
303
+ is RED at the read-only gate.
304
+
305
+ Returns the read-only :func:`enforce_stack_lock` verdict computed AFTER the
306
+ write (so the freshly-written lock is immediately verified — ``status=ok`` on
307
+ success). If the lock already exists, NOTHING is written and the existing lock
308
+ is enforced as-is (so a pre-existing drift stays RED).
309
+ """
310
+ path = stack_lock_path(project_root)
311
+ if not path.exists():
312
+ lock = build_lock(contract, adapter_digests=adapter_digests, permissions=permissions)
313
+ path.parent.mkdir(parents=True, exist_ok=True)
314
+ try:
315
+ # Exclusive create — refuse to clobber an existing lock (TOCTOU-safe).
316
+ with open(path, "x", encoding="utf-8") as fh:
317
+ fh.write(dump_lock(lock))
318
+ except FileExistsError:
319
+ # Raced: a lock appeared between the check and the create. Fall through
320
+ # to enforce the now-existing lock read-only (never overwrite it).
321
+ pass
322
+ else:
323
+ # Immediately enforce the freshly-written lock (read-only); on success
324
+ # surface it as GENERATED (traced) rather than a plain OK.
325
+ gate = enforce_stack_lock(contract, project_root)
326
+ if gate.status == LOCK_OK:
327
+ return StackLockGate(status=LOCK_GENERATED, red=False, lock_path=gate.lock_path)
328
+ return gate
329
+
330
+ # Lock already exists (or appeared in a race) — enforce it read-only, NEVER
331
+ # overwrite. A pre-existing drift therefore stays RED.
332
+ return enforce_stack_lock(contract, project_root)
333
+
334
+
335
+ def orphan_stack_lock(project_root: str | Path) -> StackLockGate | None:
336
+ """Catch a removed ``stack:`` declaration that still has a committed lock.
337
+
338
+ Closes the "drop the ``stack:`` block to dodge the gate" bypass (GPT-consult
339
+ point #1): a project with a committed ``stack.lock`` is demonstrably
340
+ stack-governed, so silently removing its declaration would convert it to an
341
+ ungoverned project (false-green). This is called ONLY when the project has NO
342
+ resolved stack contract (``stack_contract_intake`` returned ``None``):
343
+
344
+ * a committed lock still present → RED (``status=drift``): the declaration was
345
+ removed but the project is still pinned. Decommission explicitly (delete the
346
+ lock) to opt out.
347
+ * no lock → ``None`` (a genuine non-stack project — byte-identical, no gate).
348
+
349
+ Returning ``None`` is the byte-identical path that preserves the "non-stack
350
+ projects are completely unaffected" guarantee (those have no lock file).
351
+ """
352
+ path = stack_lock_path(project_root)
353
+ if not path.exists():
354
+ return None
355
+ return StackLockGate(
356
+ status=LOCK_DRIFT,
357
+ red=True,
358
+ reasons=(
359
+ "a committed stack.lock exists but the project no longer declares a "
360
+ "`stack:` block — the stack declaration was removed while the lock "
361
+ "remains. A stack-governed project cannot silently become ungoverned "
362
+ "(anti-false-green). Restore the `stack:` block, or decommission "
363
+ "explicitly by deleting the lock.",
364
+ ),
365
+ lock_path=str(path),
366
+ )
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "codd-dev"
7
- version = "2.89.0"
7
+ version = "2.90.0"
8
8
  description = "CoDD: Coherence-Driven Development — cross-artifact change impact analysis"
9
9
  readme = "README.md"
10
10
  license = "MIT"