codd-dev 2.97.0__tar.gz → 2.98.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 (623) hide show
  1. {codd_dev-2.97.0 → codd_dev-2.98.0}/PKG-INFO +1 -1
  2. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/__init__.py +1 -1
  3. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/stack/command_plan.py +180 -8
  4. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/stack/compose.py +111 -0
  5. {codd_dev-2.97.0 → codd_dev-2.98.0}/pyproject.toml +1 -1
  6. {codd_dev-2.97.0 → codd_dev-2.98.0}/.gitignore +0 -0
  7. {codd_dev-2.97.0 → codd_dev-2.98.0}/LICENSE +0 -0
  8. {codd_dev-2.97.0 → codd_dev-2.98.0}/README.md +0 -0
  9. {codd_dev-2.97.0 → codd_dev-2.98.0}/bench_fixture/README.md +0 -0
  10. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/__main__.py +0 -0
  11. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/_git_helper.py +0 -0
  12. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/action_outcome.py +0 -0
  13. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/ai_invoke.py +0 -0
  14. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/ai_patch.py +0 -0
  15. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/artifact_contract.py +0 -0
  16. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/artifact_ids.py +0 -0
  17. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/artifacts/catalog.yaml +0 -0
  18. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/ask_user_question_adapter.py +0 -0
  19. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/assembler.py +0 -0
  20. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/bridge.py +0 -0
  21. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/brownfield/__init__.py +0 -0
  22. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/brownfield/pipeline.py +0 -0
  23. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/capability_completeness.py +0 -0
  24. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/claude_cli.py +0 -0
  25. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/cli.py +0 -0
  26. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/clustering.py +0 -0
  27. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/coherence_adapters.py +0 -0
  28. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/coherence_engine.py +0 -0
  29. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/confidence.py +0 -0
  30. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/config.py +0 -0
  31. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/config_schema.py +0 -0
  32. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/contracts.py +0 -0
  33. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/contracts_registry/__init__.py +0 -0
  34. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/contracts_registry/__main__.py +0 -0
  35. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/contracts_registry/certify.py +0 -0
  36. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/contracts_registry/generate_matrix.py +0 -0
  37. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/contracts_registry/registry.py +0 -0
  38. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/coverage_auditor.py +0 -0
  39. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/coverage_execution_coherence.py +0 -0
  40. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/coverage_metrics.py +0 -0
  41. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/dag/__init__.py +0 -0
  42. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/dag/auto_repair.py +0 -0
  43. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/dag/builder.py +0 -0
  44. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/dag/checks/__init__.py +0 -0
  45. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/dag/checks/_one_to_many_detection.py +0 -0
  46. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/dag/checks/artifact_contract_check.py +0 -0
  47. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/dag/checks/ci_health.py +0 -0
  48. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/dag/checks/dependency_freshness.py +0 -0
  49. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/dag/checks/depends_on_consistency.py +0 -0
  50. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/dag/checks/deployment_completeness.py +0 -0
  51. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/dag/checks/edge_validity.py +0 -0
  52. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/dag/checks/environment_coverage.py +0 -0
  53. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/dag/checks/implementation_coverage.py +0 -0
  54. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/dag/checks/node_completeness.py +0 -0
  55. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/dag/checks/opt_out.py +0 -0
  56. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/dag/checks/task_completion.py +0 -0
  57. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/dag/checks/transitive_closure.py +0 -0
  58. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/dag/checks/ui_coherence.py +0 -0
  59. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/dag/checks/user_journey_coherence.py +0 -0
  60. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/dag/coverage_axes.py +0 -0
  61. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/dag/defaults/cli.yaml +0 -0
  62. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/dag/defaults/cpp_embedded.yaml +0 -0
  63. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/dag/defaults/csharp.yaml +0 -0
  64. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/dag/defaults/elixir.yaml +0 -0
  65. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/dag/defaults/generic.yaml +0 -0
  66. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/dag/defaults/iot.yaml +0 -0
  67. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/dag/defaults/java.yaml +0 -0
  68. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/dag/defaults/kotlin.yaml +0 -0
  69. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/dag/defaults/mobile.yaml +0 -0
  70. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/dag/defaults/ruby.yaml +0 -0
  71. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/dag/defaults/rust.yaml +0 -0
  72. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/dag/defaults/scala.yaml +0 -0
  73. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/dag/defaults/swift.yaml +0 -0
  74. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/dag/defaults/test_frameworks.yaml +0 -0
  75. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/dag/defaults/web.yaml +0 -0
  76. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/dag/extractor.py +0 -0
  77. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/dag/impact.py +0 -0
  78. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/dag/runner.py +0 -0
  79. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/defaults.py +0 -0
  80. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/defaults.yaml +0 -0
  81. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/dependency_lock_coherence.py +0 -0
  82. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/deploy_targets/__init__.py +0 -0
  83. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/deploy_targets/app_service.py +0 -0
  84. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/deploy_targets/base.py +0 -0
  85. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/deploy_targets/docker_compose.py +0 -0
  86. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/deployer.py +0 -0
  87. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/deployment/__init__.py +0 -0
  88. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/deployment/checks/__init__.py +0 -0
  89. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/deployment/defaults/deploy_targets.yaml +0 -0
  90. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/deployment/defaults/runtime_capability_inference.yaml +0 -0
  91. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/deployment/defaults/schema_providers.yaml +0 -0
  92. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/deployment/defaults/verification_templates.yaml +0 -0
  93. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/deployment/extractor.py +0 -0
  94. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/deployment/providers/__init__.py +0 -0
  95. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/deployment/providers/ai_command.py +0 -0
  96. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/deployment/providers/ai_command_factory.py +0 -0
  97. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/deployment/providers/codex_app_server.py +0 -0
  98. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/deployment/providers/llm_consideration.py +0 -0
  99. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/deployment/providers/schema/__init__.py +0 -0
  100. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/deployment/providers/schema/prisma.py +0 -0
  101. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/deployment/providers/target/__init__.py +0 -0
  102. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/deployment/providers/target/docker_compose.py +0 -0
  103. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/deployment/providers/verification/__init__.py +0 -0
  104. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/deployment/providers/verification/assertion_handlers.py +0 -0
  105. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/deployment/providers/verification/cdp_browser.py +0 -0
  106. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/deployment/providers/verification/cdp_engines.py +0 -0
  107. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/deployment/providers/verification/cdp_launchers.py +0 -0
  108. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/deployment/providers/verification/cdp_wire.py +0 -0
  109. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/deployment/providers/verification/curl.py +0 -0
  110. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/deployment/providers/verification/form_strategies.py +0 -0
  111. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/deployment/providers/verification/means_catalog.py +0 -0
  112. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/deployment/providers/verification/playwright.py +0 -0
  113. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/deployment/providers/verification/pytest_http.py +0 -0
  114. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/deployment/providers/verification/vitest.py +0 -0
  115. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/design_md.py +0 -0
  116. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/diff/__init__.py +0 -0
  117. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/diff/apply.py +0 -0
  118. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/diff/engine.py +0 -0
  119. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/diff/persistence.py +0 -0
  120. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/diff/templates/diff_prompt.md +0 -0
  121. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/discovery.py +0 -0
  122. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/drift.py +0 -0
  123. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/e2e_contract_coherence.py +0 -0
  124. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/e2e_extractor.py +0 -0
  125. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/e2e_generator.py +0 -0
  126. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/e2e_harness.py +0 -0
  127. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/e2e_runner.py +0 -0
  128. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/elicit/__init__.py +0 -0
  129. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/elicit/apply.py +0 -0
  130. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/elicit/engine.py +0 -0
  131. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/elicit/finding.py +0 -0
  132. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/elicit/formatters/__init__.py +0 -0
  133. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/elicit/formatters/base.py +0 -0
  134. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/elicit/formatters/interactive.py +0 -0
  135. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/elicit/formatters/json_fmt.py +0 -0
  136. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/elicit/formatters/md.py +0 -0
  137. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/elicit/lexicon_loader.py +0 -0
  138. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/elicit/persistence.py +0 -0
  139. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/elicit/templates/elicit_prompt_L0.md +0 -0
  140. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/env_refs.py +0 -0
  141. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/extract_ai.py +0 -0
  142. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/extract_paths.py +0 -0
  143. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/extractor.py +0 -0
  144. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/fix/__init__.py +0 -0
  145. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/fix/candidate_selector.py +0 -0
  146. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/fix/design_updater.py +0 -0
  147. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/fix/impl_propagation.py +0 -0
  148. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/fix/interactive_prompt.py +0 -0
  149. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/fix/phenomenon_fixer.py +0 -0
  150. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/fix/phenomenon_parser.py +0 -0
  151. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/fix/risk_classifier.py +0 -0
  152. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/fix/templates/clarification_question.txt +0 -0
  153. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/fix/templates/design_update.txt +0 -0
  154. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/fix/templates/impl_update.txt +0 -0
  155. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/fix/templates/phenomenon_parse.txt +0 -0
  156. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/fix/templates/risk_assessment.txt +0 -0
  157. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/fix/templates_loader.py +0 -0
  158. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/fixer.py +0 -0
  159. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/fixup_drift.py +0 -0
  160. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/fixup_drift_strategies/__init__.py +0 -0
  161. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/fixup_drift_strategies/design_token_drift.py +0 -0
  162. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/fixup_drift_strategies/lexicon_violation.py +0 -0
  163. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/fixup_drift_strategies/url_drift.py +0 -0
  164. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/frontmatter.py +0 -0
  165. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/generator.py +0 -0
  166. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/git_evidence.py +0 -0
  167. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/graph.py +0 -0
  168. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/greenfield/__init__.py +0 -0
  169. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/greenfield/pipeline.py +0 -0
  170. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/hitl_session.py +0 -0
  171. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/hooks/__init__.py +0 -0
  172. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/hooks/pre-commit +0 -0
  173. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/hooks/recipes/claude_requirements_nudge.json +0 -0
  174. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/hooks/recipes/claude_settings_example.json +0 -0
  175. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/hooks/recipes/codex_hook.sh +0 -0
  176. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/hooks/recipes/git_post_commit.sh +0 -0
  177. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/hooks/recipes/git_pre_commit.sh +0 -0
  178. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/iac_nfr.py +0 -0
  179. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/implement_oracle.py +0 -0
  180. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/implement_oracle_scope.py +0 -0
  181. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/implement_oracle_types.py +0 -0
  182. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/implementer/__init__.py +0 -0
  183. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/implementer/chunked_runner.py +0 -0
  184. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/implementer/typecheck_loop.py +0 -0
  185. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/implementer.py +0 -0
  186. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/import_coherence.py +0 -0
  187. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/inheritance.py +0 -0
  188. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/init/__init__.py +0 -0
  189. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/init/lexicon_suggest.py +0 -0
  190. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/init/llm_lexicon_suggester.py +0 -0
  191. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/init/stack_detector.py +0 -0
  192. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/knowledge_fetcher.py +0 -0
  193. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/languages/__init__.py +0 -0
  194. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/languages/adapters/__init__.py +0 -0
  195. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/languages/adapters/implement_oracle.py +0 -0
  196. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/languages/adapters/oracle_go.py +0 -0
  197. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/languages/adapters/oracle_python.py +0 -0
  198. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/languages/adapters/oracle_typescript.py +0 -0
  199. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/languages/adapters/runner_report.py +0 -0
  200. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/languages/builtin_adapters.py +0 -0
  201. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/languages/compat.py +0 -0
  202. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/languages/contract.py +0 -0
  203. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/languages/loader.py +0 -0
  204. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/languages/oracle_executor.py +0 -0
  205. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/languages/path_planner.py +0 -0
  206. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/languages/profile.py +0 -0
  207. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/languages/profiles/go.yaml +0 -0
  208. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/languages/profiles/python.yaml +0 -0
  209. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/languages/profiles/typescript.yaml +0 -0
  210. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/languages/registry.py +0 -0
  211. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/languages/verify_executor.py +0 -0
  212. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/languages/verify_plan.py +0 -0
  213. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/lexicon.py +0 -0
  214. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/lexicon_cli/__init__.py +0 -0
  215. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/lexicon_cli/formatters/__init__.py +0 -0
  216. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/lexicon_cli/formatters/html.py +0 -0
  217. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/lexicon_cli/formatters/json_fmt.py +0 -0
  218. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/lexicon_cli/formatters/md.py +0 -0
  219. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/lexicon_cli/inspector.py +0 -0
  220. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/lexicon_cli/manager.py +0 -0
  221. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/lexicon_cli/reporter.py +0 -0
  222. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/lexicon_cli/threshold.py +0 -0
  223. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/llm/__init__.py +0 -0
  224. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/llm/approval.py +0 -0
  225. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/llm/best_practice_augmenter.py +0 -0
  226. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/llm/criteria_expander.py +0 -0
  227. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/llm/design_doc_extractor.py +0 -0
  228. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/llm/impl_step_deriver.py +0 -0
  229. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/llm/means_catalog_loader.py +0 -0
  230. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/llm/parser.py +0 -0
  231. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/llm/plan_deriver.py +0 -0
  232. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/llm/prompt_builder.py +0 -0
  233. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/llm/strategy_validator.py +0 -0
  234. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/llm/templates/best_practice_augment_meta.md +0 -0
  235. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/llm/templates/criteria_expand_meta.md +0 -0
  236. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/llm/templates/design_doc_extract_meta.md +0 -0
  237. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/llm/templates/impl_step_derive_meta.md +0 -0
  238. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/llm/templates/implementation_step_catalog.yaml +0 -0
  239. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/llm/templates/meta_instruction.md +0 -0
  240. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/llm/templates/plan_derive_meta.md +0 -0
  241. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/llm/templates/verification_means_catalog.yaml +0 -0
  242. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/mcp_server.py +0 -0
  243. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/measure.py +0 -0
  244. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/operational_e2e_audit.py +0 -0
  245. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/operations_derive.py +0 -0
  246. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/parsing/__init__.py +0 -0
  247. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/parsing/_shared.py +0 -0
  248. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/parsing/api_specs.py +0 -0
  249. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/parsing/extractor_registry.py +0 -0
  250. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/parsing/filesystem_routes.py +0 -0
  251. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/parsing/iac.py +0 -0
  252. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/parsing/python_ast.py +0 -0
  253. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/parsing/regex_strategies.py +0 -0
  254. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/parsing/schemas.py +0 -0
  255. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/parsing/tests_builddeps.py +0 -0
  256. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/parsing/treesitter.py +0 -0
  257. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/planner.py +0 -0
  258. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/policy.py +0 -0
  259. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/preflight/__init__.py +0 -0
  260. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/preflight/defaults/cli.yaml +0 -0
  261. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/preflight/defaults/generic.yaml +0 -0
  262. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/preflight/defaults/iot.yaml +0 -0
  263. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/preflight/defaults/mobile.yaml +0 -0
  264. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/preflight/defaults/web.yaml +0 -0
  265. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/project_types.py +0 -0
  266. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/propagate.py +0 -0
  267. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/propagation_common.py +0 -0
  268. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/propagator.py +0 -0
  269. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/reconciliation_ledger.py +0 -0
  270. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/reference_resolution.py +0 -0
  271. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/registry.py +0 -0
  272. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/repair/__init__.py +0 -0
  273. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/repair/approval_repair.py +0 -0
  274. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/repair/auto_scope_guard.py +0 -0
  275. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/repair/engine.py +0 -0
  276. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/repair/git_patcher.py +0 -0
  277. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/repair/history.py +0 -0
  278. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/repair/llm_repair_engine.py +0 -0
  279. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/repair/loop.py +0 -0
  280. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/repair/primary_picker.py +0 -0
  281. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/repair/proof_breaks.py +0 -0
  282. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/repair/repair_result.py +0 -0
  283. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/repair/repairability_classifier.py +0 -0
  284. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/repair/schema.py +0 -0
  285. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/repair/templates/analyze_meta.md +0 -0
  286. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/repair/templates/propose_meta.md +0 -0
  287. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/repair/templates/repair_strategy_meta.md +0 -0
  288. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/repair/templates/repairability_meta.md +0 -0
  289. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/repair/test_failure_attribution.py +0 -0
  290. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/repair/verify_runner.py +0 -0
  291. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/repair_slice.py +0 -0
  292. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/require.py +0 -0
  293. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/require_plugins.py +0 -0
  294. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/require_propagate.py +0 -0
  295. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/required_artifacts/defaults/cli.yaml +0 -0
  296. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/required_artifacts/defaults/generic.yaml +0 -0
  297. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/required_artifacts/defaults/iot.yaml +0 -0
  298. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/required_artifacts/defaults/mobile.yaml +0 -0
  299. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/required_artifacts/defaults/web.yaml +0 -0
  300. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/required_artifacts_deriver.py +0 -0
  301. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/requirement_completeness/defaults/cli.yaml +0 -0
  302. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/requirement_completeness/defaults/generic.yaml +0 -0
  303. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/requirement_completeness/defaults/iot.yaml +0 -0
  304. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/requirement_completeness/defaults/mobile.yaml +0 -0
  305. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/requirement_completeness/defaults/web.yaml +0 -0
  306. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/requirement_completeness_auditor.py +0 -0
  307. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/requirement_reconciliation.py +0 -0
  308. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/requirements_meta.py +0 -0
  309. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/restoration_report.py +0 -0
  310. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/restore.py +0 -0
  311. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/routes_extractor.py +0 -0
  312. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/runtime_smoke/__init__.py +0 -0
  313. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/runtime_smoke/checks.py +0 -0
  314. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/runtime_smoke/config.py +0 -0
  315. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/runtime_smoke/report.py +0 -0
  316. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/runtime_smoke/runner.py +0 -0
  317. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/scanner.py +0 -0
  318. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/schema_refs.py +0 -0
  319. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/screen_flow_validator.py +0 -0
  320. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/screen_transition_extractor.py +0 -0
  321. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/screen_transitions/defaults.yaml +0 -0
  322. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/skills_cli/__init__.py +0 -0
  323. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/skills_cli/discovery.py +0 -0
  324. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/skills_cli/manager.py +0 -0
  325. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/skills_cli/paths.py +0 -0
  326. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/stack/__init__.py +0 -0
  327. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/stack/adapters/__init__.py +0 -0
  328. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/stack/adapters/_base.py +0 -0
  329. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/stack/adapters/nextjs.py +0 -0
  330. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/stack/adapters/playwright.py +0 -0
  331. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/stack/command_authenticity.py +0 -0
  332. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/stack/loader.py +0 -0
  333. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/stack/lock.py +0 -0
  334. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/stack/obligations.py +0 -0
  335. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/stack/profile.py +0 -0
  336. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/stack/profiles/addons/playwright.yaml +0 -0
  337. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/stack/profiles/addons/prisma.yaml +0 -0
  338. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/stack/profiles/frameworks/nextjs.yaml +0 -0
  339. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/stack/project.py +0 -0
  340. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/stack/registry.py +0 -0
  341. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/stack/replacement_proof.py +0 -0
  342. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/stack/resolve.py +0 -0
  343. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/surface_reconciliation.py +0 -0
  344. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/synth.py +0 -0
  345. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/templates/codd.yaml.tmpl +0 -0
  346. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/templates/conventions.yaml.tmpl +0 -0
  347. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/templates/data_dependencies.yaml.tmpl +0 -0
  348. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/templates/doc_links.yaml.tmpl +0 -0
  349. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/templates/extract_ai_prompt_baseline.md +0 -0
  350. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/templates/extracted/api-contract.md.j2 +0 -0
  351. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/templates/extracted/architecture-overview.md.j2 +0 -0
  352. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/templates/extracted/module-detail.md.j2 +0 -0
  353. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/templates/extracted/schema-design.md.j2 +0 -0
  354. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/templates/extracted/system-context.md.j2 +0 -0
  355. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/templates/gitignore.tmpl +0 -0
  356. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/templates/lexicon_questions.md +0 -0
  357. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/templates/lexicon_schema.yaml +0 -0
  358. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/templates/overrides.yaml.tmpl +0 -0
  359. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/test_detection.py +0 -0
  360. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/test_import_coherence.py +0 -0
  361. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/traceability.py +0 -0
  362. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/validator.py +0 -0
  363. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/vb_marker_authenticity.py +0 -0
  364. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/vb_rerun_scope.py +0 -0
  365. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/verifiable_behavior_audit.py +0 -0
  366. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/watch/__init__.py +0 -0
  367. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/watch/events.py +0 -0
  368. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/watch/propagation_log.py +0 -0
  369. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/watch/propagation_pipeline.py +0 -0
  370. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/watch/test_runner.py +0 -0
  371. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/watch/watcher.py +0 -0
  372. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd/wiring.py +0 -0
  373. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/ai_governance_eu_act/coverage_matrix.md +0 -0
  374. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/ai_governance_eu_act/elicit_extend.md +0 -0
  375. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/ai_governance_eu_act/lexicon.yaml +0 -0
  376. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/ai_governance_eu_act/manifest.yaml +0 -0
  377. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/ai_governance_eu_act/recommended_kinds.yaml +0 -0
  378. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/ai_governance_eu_act/severity_rules.yaml +0 -0
  379. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/api_rate_limiting_caching/coverage_matrix.md +0 -0
  380. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/api_rate_limiting_caching/elicit_extend.md +0 -0
  381. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/api_rate_limiting_caching/lexicon.yaml +0 -0
  382. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/api_rate_limiting_caching/manifest.yaml +0 -0
  383. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/api_rate_limiting_caching/recommended_kinds.yaml +0 -0
  384. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/api_rate_limiting_caching/severity_rules.yaml +0 -0
  385. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/api_rest_openapi/coverage_matrix.md +0 -0
  386. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/api_rest_openapi/elicit_extend.md +0 -0
  387. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/api_rest_openapi/lexicon.yaml +0 -0
  388. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/api_rest_openapi/manifest.yaml +0 -0
  389. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/api_rest_openapi/recommended_kinds.yaml +0 -0
  390. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/api_rest_openapi/severity_rules.yaml +0 -0
  391. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/babok/elicit_extend.md +0 -0
  392. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/babok/lexicon.yaml +0 -0
  393. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/babok/manifest.yaml +0 -0
  394. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/babok/recommended_kinds.yaml +0 -0
  395. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/babok/severity_rules.yaml +0 -0
  396. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/backend_event_cloudevents/coverage_matrix.md +0 -0
  397. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/backend_event_cloudevents/elicit_extend.md +0 -0
  398. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/backend_event_cloudevents/lexicon.yaml +0 -0
  399. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/backend_event_cloudevents/manifest.yaml +0 -0
  400. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/backend_event_cloudevents/recommended_kinds.yaml +0 -0
  401. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/backend_event_cloudevents/severity_rules.yaml +0 -0
  402. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/backend_graphql/coverage_matrix.md +0 -0
  403. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/backend_graphql/elicit_extend.md +0 -0
  404. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/backend_graphql/lexicon.yaml +0 -0
  405. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/backend_graphql/manifest.yaml +0 -0
  406. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/backend_graphql/recommended_kinds.yaml +0 -0
  407. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/backend_graphql/severity_rules.yaml +0 -0
  408. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/backend_grpc_proto/coverage_matrix.md +0 -0
  409. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/backend_grpc_proto/elicit_extend.md +0 -0
  410. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/backend_grpc_proto/lexicon.yaml +0 -0
  411. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/backend_grpc_proto/manifest.yaml +0 -0
  412. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/backend_grpc_proto/recommended_kinds.yaml +0 -0
  413. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/backend_grpc_proto/severity_rules.yaml +0 -0
  414. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/compliance_hipaa/coverage_matrix.md +0 -0
  415. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/compliance_hipaa/elicit_extend.md +0 -0
  416. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/compliance_hipaa/lexicon.yaml +0 -0
  417. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/compliance_hipaa/manifest.yaml +0 -0
  418. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/compliance_hipaa/recommended_kinds.yaml +0 -0
  419. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/compliance_hipaa/severity_rules.yaml +0 -0
  420. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/compliance_iso27001/coverage_matrix.md +0 -0
  421. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/compliance_iso27001/elicit_extend.md +0 -0
  422. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/compliance_iso27001/lexicon.yaml +0 -0
  423. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/compliance_iso27001/manifest.yaml +0 -0
  424. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/compliance_iso27001/recommended_kinds.yaml +0 -0
  425. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/compliance_iso27001/severity_rules.yaml +0 -0
  426. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/compliance_pci_dss_4/coverage_matrix.md +0 -0
  427. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/compliance_pci_dss_4/elicit_extend.md +0 -0
  428. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/compliance_pci_dss_4/lexicon.yaml +0 -0
  429. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/compliance_pci_dss_4/manifest.yaml +0 -0
  430. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/compliance_pci_dss_4/recommended_kinds.yaml +0 -0
  431. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/compliance_pci_dss_4/severity_rules.yaml +0 -0
  432. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/data_aggregation_policies/coverage_matrix.md +0 -0
  433. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/data_aggregation_policies/elicit_extend.md +0 -0
  434. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/data_aggregation_policies/lexicon.yaml +0 -0
  435. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/data_aggregation_policies/manifest.yaml +0 -0
  436. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/data_aggregation_policies/recommended_kinds.yaml +0 -0
  437. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/data_aggregation_policies/severity_rules.yaml +0 -0
  438. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/coverage_matrix.md +0 -0
  439. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/elicit_extend.md +0 -0
  440. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/lexicon.yaml +0 -0
  441. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/manifest.yaml +0 -0
  442. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/recommended_kinds.yaml +0 -0
  443. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/severity_rules.yaml +0 -0
  444. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/data_governance_appi_gdpr/coverage_matrix.md +0 -0
  445. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/data_governance_appi_gdpr/elicit_extend.md +0 -0
  446. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/data_governance_appi_gdpr/lexicon.yaml +0 -0
  447. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/data_governance_appi_gdpr/manifest.yaml +0 -0
  448. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/data_governance_appi_gdpr/recommended_kinds.yaml +0 -0
  449. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/data_governance_appi_gdpr/severity_rules.yaml +0 -0
  450. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/data_nosql_jsonschema/coverage_matrix.md +0 -0
  451. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/data_nosql_jsonschema/elicit_extend.md +0 -0
  452. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/data_nosql_jsonschema/lexicon.yaml +0 -0
  453. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/data_nosql_jsonschema/manifest.yaml +0 -0
  454. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/data_nosql_jsonschema/recommended_kinds.yaml +0 -0
  455. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/data_nosql_jsonschema/severity_rules.yaml +0 -0
  456. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/data_relational_iso_sql/coverage_matrix.md +0 -0
  457. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/data_relational_iso_sql/elicit_extend.md +0 -0
  458. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/data_relational_iso_sql/lexicon.yaml +0 -0
  459. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/data_relational_iso_sql/manifest.yaml +0 -0
  460. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/data_relational_iso_sql/recommended_kinds.yaml +0 -0
  461. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/data_relational_iso_sql/severity_rules.yaml +0 -0
  462. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/ddd_domain_driven_design/coverage_matrix.md +0 -0
  463. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/ddd_domain_driven_design/elicit_extend.md +0 -0
  464. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/ddd_domain_driven_design/lexicon.yaml +0 -0
  465. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/ddd_domain_driven_design/manifest.yaml +0 -0
  466. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/ddd_domain_driven_design/recommended_kinds.yaml +0 -0
  467. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/ddd_domain_driven_design/severity_rules.yaml +0 -0
  468. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/dora_sre_metrics/coverage_matrix.md +0 -0
  469. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/dora_sre_metrics/elicit_extend.md +0 -0
  470. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/dora_sre_metrics/lexicon.yaml +0 -0
  471. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/dora_sre_metrics/manifest.yaml +0 -0
  472. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/dora_sre_metrics/recommended_kinds.yaml +0 -0
  473. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/dora_sre_metrics/severity_rules.yaml +0 -0
  474. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/i18n_unicode_cldr/coverage_matrix.md +0 -0
  475. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/i18n_unicode_cldr/elicit_extend.md +0 -0
  476. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/i18n_unicode_cldr/lexicon.yaml +0 -0
  477. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/i18n_unicode_cldr/manifest.yaml +0 -0
  478. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/i18n_unicode_cldr/recommended_kinds.yaml +0 -0
  479. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/i18n_unicode_cldr/severity_rules.yaml +0 -0
  480. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/ml_model_cards/coverage_matrix.md +0 -0
  481. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/ml_model_cards/elicit_extend.md +0 -0
  482. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/ml_model_cards/lexicon.yaml +0 -0
  483. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/ml_model_cards/manifest.yaml +0 -0
  484. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/ml_model_cards/recommended_kinds.yaml +0 -0
  485. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/ml_model_cards/severity_rules.yaml +0 -0
  486. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/mobile_a11y_native/coverage_matrix.md +0 -0
  487. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/mobile_a11y_native/elicit_extend.md +0 -0
  488. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/mobile_a11y_native/lexicon.yaml +0 -0
  489. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/mobile_a11y_native/manifest.yaml +0 -0
  490. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/mobile_a11y_native/recommended_kinds.yaml +0 -0
  491. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/mobile_a11y_native/severity_rules.yaml +0 -0
  492. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/mobile_android_material3/coverage_matrix.md +0 -0
  493. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/mobile_android_material3/elicit_extend.md +0 -0
  494. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/mobile_android_material3/lexicon.yaml +0 -0
  495. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/mobile_android_material3/manifest.yaml +0 -0
  496. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/mobile_android_material3/recommended_kinds.yaml +0 -0
  497. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/mobile_android_material3/severity_rules.yaml +0 -0
  498. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/mobile_ios_hig/coverage_matrix.md +0 -0
  499. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/mobile_ios_hig/elicit_extend.md +0 -0
  500. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/mobile_ios_hig/lexicon.yaml +0 -0
  501. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/mobile_ios_hig/manifest.yaml +0 -0
  502. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/mobile_ios_hig/recommended_kinds.yaml +0 -0
  503. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/mobile_ios_hig/severity_rules.yaml +0 -0
  504. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/mobile_security_masvs/coverage_matrix.md +0 -0
  505. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/mobile_security_masvs/elicit_extend.md +0 -0
  506. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/mobile_security_masvs/lexicon.yaml +0 -0
  507. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/mobile_security_masvs/manifest.yaml +0 -0
  508. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/mobile_security_masvs/recommended_kinds.yaml +0 -0
  509. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/mobile_security_masvs/severity_rules.yaml +0 -0
  510. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/ops_cicd_pipeline/coverage_matrix.md +0 -0
  511. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/ops_cicd_pipeline/elicit_extend.md +0 -0
  512. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/ops_cicd_pipeline/lexicon.yaml +0 -0
  513. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/ops_cicd_pipeline/manifest.yaml +0 -0
  514. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/ops_cicd_pipeline/recommended_kinds.yaml +0 -0
  515. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/ops_cicd_pipeline/severity_rules.yaml +0 -0
  516. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/ops_iac_terraform/coverage_matrix.md +0 -0
  517. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/ops_iac_terraform/elicit_extend.md +0 -0
  518. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/ops_iac_terraform/lexicon.yaml +0 -0
  519. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/ops_iac_terraform/manifest.yaml +0 -0
  520. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/ops_iac_terraform/recommended_kinds.yaml +0 -0
  521. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/ops_iac_terraform/severity_rules.yaml +0 -0
  522. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/ops_kubernetes/coverage_matrix.md +0 -0
  523. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/ops_kubernetes/elicit_extend.md +0 -0
  524. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/ops_kubernetes/lexicon.yaml +0 -0
  525. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/ops_kubernetes/manifest.yaml +0 -0
  526. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/ops_kubernetes/recommended_kinds.yaml +0 -0
  527. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/ops_kubernetes/severity_rules.yaml +0 -0
  528. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/ops_observability_otel/coverage_matrix.md +0 -0
  529. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/ops_observability_otel/elicit_extend.md +0 -0
  530. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/ops_observability_otel/lexicon.yaml +0 -0
  531. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/ops_observability_otel/manifest.yaml +0 -0
  532. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/ops_observability_otel/recommended_kinds.yaml +0 -0
  533. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/ops_observability_otel/severity_rules.yaml +0 -0
  534. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/process_iso25010/coverage_matrix.md +0 -0
  535. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/process_iso25010/elicit_extend.md +0 -0
  536. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/process_iso25010/lexicon.yaml +0 -0
  537. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/process_iso25010/manifest.yaml +0 -0
  538. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/process_iso25010/recommended_kinds.yaml +0 -0
  539. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/process_iso25010/severity_rules.yaml +0 -0
  540. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/process_test_iso29119/coverage_matrix.md +0 -0
  541. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/process_test_iso29119/elicit_extend.md +0 -0
  542. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/process_test_iso29119/lexicon.yaml +0 -0
  543. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/process_test_iso29119/manifest.yaml +0 -0
  544. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/process_test_iso29119/recommended_kinds.yaml +0 -0
  545. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/process_test_iso29119/severity_rules.yaml +0 -0
  546. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/twelve_factor_app/coverage_matrix.md +0 -0
  547. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/twelve_factor_app/elicit_extend.md +0 -0
  548. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/twelve_factor_app/lexicon.yaml +0 -0
  549. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/twelve_factor_app/manifest.yaml +0 -0
  550. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/twelve_factor_app/recommended_kinds.yaml +0 -0
  551. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/twelve_factor_app/severity_rules.yaml +0 -0
  552. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/coverage_matrix.md +0 -0
  553. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/elicit_extend.md +0 -0
  554. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/lexicon.yaml +0 -0
  555. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/manifest.yaml +0 -0
  556. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/recommended_kinds.yaml +0 -0
  557. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/severity_rules.yaml +0 -0
  558. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/web_authn_webauthn/coverage_matrix.md +0 -0
  559. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/web_authn_webauthn/elicit_extend.md +0 -0
  560. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/web_authn_webauthn/lexicon.yaml +0 -0
  561. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/web_authn_webauthn/manifest.yaml +0 -0
  562. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/web_authn_webauthn/recommended_kinds.yaml +0 -0
  563. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/web_authn_webauthn/severity_rules.yaml +0 -0
  564. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/web_browser_compat/coverage_matrix.md +0 -0
  565. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/web_browser_compat/elicit_extend.md +0 -0
  566. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/web_browser_compat/lexicon.yaml +0 -0
  567. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/web_browser_compat/manifest.yaml +0 -0
  568. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/web_browser_compat/recommended_kinds.yaml +0 -0
  569. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/web_browser_compat/severity_rules.yaml +0 -0
  570. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/web_forms_html5/coverage_matrix.md +0 -0
  571. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/web_forms_html5/elicit_extend.md +0 -0
  572. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/web_forms_html5/lexicon.yaml +0 -0
  573. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/web_forms_html5/manifest.yaml +0 -0
  574. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/web_forms_html5/recommended_kinds.yaml +0 -0
  575. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/web_forms_html5/severity_rules.yaml +0 -0
  576. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/web_performance_core_web_vitals/coverage_matrix.md +0 -0
  577. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/web_performance_core_web_vitals/elicit_extend.md +0 -0
  578. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/web_performance_core_web_vitals/lexicon.yaml +0 -0
  579. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/web_performance_core_web_vitals/manifest.yaml +0 -0
  580. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/web_performance_core_web_vitals/recommended_kinds.yaml +0 -0
  581. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/web_performance_core_web_vitals/severity_rules.yaml +0 -0
  582. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/web_pwa_manifest/coverage_matrix.md +0 -0
  583. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/web_pwa_manifest/elicit_extend.md +0 -0
  584. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/web_pwa_manifest/lexicon.yaml +0 -0
  585. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/web_pwa_manifest/manifest.yaml +0 -0
  586. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/web_pwa_manifest/recommended_kinds.yaml +0 -0
  587. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/web_pwa_manifest/severity_rules.yaml +0 -0
  588. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/web_responsive/coverage_matrix.md +0 -0
  589. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/web_responsive/elicit_extend.md +0 -0
  590. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/web_responsive/lexicon.yaml +0 -0
  591. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/web_responsive/manifest.yaml +0 -0
  592. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/web_responsive/recommended_kinds.yaml +0 -0
  593. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/web_responsive/severity_rules.yaml +0 -0
  594. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/web_security_owasp/coverage_matrix.md +0 -0
  595. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/web_security_owasp/elicit_extend.md +0 -0
  596. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/web_security_owasp/lexicon.yaml +0 -0
  597. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/web_security_owasp/manifest.yaml +0 -0
  598. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/web_security_owasp/recommended_kinds.yaml +0 -0
  599. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/web_security_owasp/severity_rules.yaml +0 -0
  600. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/web_seo_schemaorg/coverage_matrix.md +0 -0
  601. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/web_seo_schemaorg/elicit_extend.md +0 -0
  602. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/web_seo_schemaorg/lexicon.yaml +0 -0
  603. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/web_seo_schemaorg/manifest.yaml +0 -0
  604. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/web_seo_schemaorg/recommended_kinds.yaml +0 -0
  605. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/lexicons/web_seo_schemaorg/severity_rules.yaml +0 -0
  606. {codd_dev-2.97.0 → codd_dev-2.98.0}/codd_plugins/stack_map.yaml +0 -0
  607. {codd_dev-2.97.0 → codd_dev-2.98.0}/docs/cookbook/cdp_browser/README.md +0 -0
  608. {codd_dev-2.97.0 → codd_dev-2.98.0}/docs/cookbook/presentation_aggregation/README.md +0 -0
  609. {codd_dev-2.97.0 → codd_dev-2.98.0}/docs/requirements/README.md +0 -0
  610. {codd_dev-2.97.0 → codd_dev-2.98.0}/dogfood/README.md +0 -0
  611. {codd_dev-2.97.0 → codd_dev-2.98.0}/dogfood/fixtures/flat_py_app/README.md +0 -0
  612. {codd_dev-2.97.0 → codd_dev-2.98.0}/examples/README.md +0 -0
  613. {codd_dev-2.97.0 → codd_dev-2.98.0}/skills/codd-assemble/SKILL.md +0 -0
  614. {codd_dev-2.97.0 → codd_dev-2.98.0}/skills/codd-evolve/SKILL.md +0 -0
  615. {codd_dev-2.97.0 → codd_dev-2.98.0}/skills/codd-generate/SKILL.md +0 -0
  616. {codd_dev-2.97.0 → codd_dev-2.98.0}/skills/codd-greenfield/SKILL.md +0 -0
  617. {codd_dev-2.97.0 → codd_dev-2.98.0}/skills/codd-impact/SKILL.md +0 -0
  618. {codd_dev-2.97.0 → codd_dev-2.98.0}/skills/codd-init/SKILL.md +0 -0
  619. {codd_dev-2.97.0 → codd_dev-2.98.0}/skills/codd-propagate/SKILL.md +0 -0
  620. {codd_dev-2.97.0 → codd_dev-2.98.0}/skills/codd-restore/SKILL.md +0 -0
  621. {codd_dev-2.97.0 → codd_dev-2.98.0}/skills/codd-scan/SKILL.md +0 -0
  622. {codd_dev-2.97.0 → codd_dev-2.98.0}/skills/codd-validate/SKILL.md +0 -0
  623. {codd_dev-2.97.0 → codd_dev-2.98.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.97.0
3
+ Version: 2.98.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.97.0"
3
+ __version__ = "2.98.0"
@@ -39,14 +39,33 @@ non-stack runs are byte-identical (no plan, no new trace keys, no execution).
39
39
  from __future__ import annotations
40
40
 
41
41
  import os
42
+ import re
42
43
  import subprocess # noqa: S404 — argv comes from the trusted resolved stack contract, shell=False.
43
44
  from dataclasses import dataclass, field
44
45
  from pathlib import Path
45
46
  from typing import Any, Mapping, Protocol, Sequence
46
47
 
47
48
  from codd.languages.profile import CommandSpec
48
-
49
- from .compose import ResolvedStackContract
49
+ from codd.languages.verify_plan import _substitute_layout_placeholders
50
+
51
+ from .compose import (
52
+ NON_VERIFICATION_SLOTS,
53
+ VERIFICATION_SLOTS,
54
+ ResolvedStackContract,
55
+ StackLayout,
56
+ )
57
+
58
+ #: The layout placeholder tokens the plan substitutes. The unsubstituted-guard matches
59
+ #: ONLY these KNOWN tokens (not an arbitrary ``\{...\}``) so a legitimate argv that
60
+ #: happens to carry braces — a JSON ``--define={...}`` flag, or a ``printf '%s'
61
+ #: '{"suites":...}'`` that streams a report — is NOT a false positive (the v2.75 oracle
62
+ #: path can use the broad regex because oracle argv is never JSON; stack e2e argv can be).
63
+ #: A remaining KNOWN token means the layout did not resolve it → the executor must NOT
64
+ #: spawn in a literal ``{module_root}`` dir / write to a literal ``{report}`` path.
65
+ _KNOWN_LAYOUT_PLACEHOLDERS = ("{module_root}", "{repo_root}", "{manifest_root}", "{test_root}", "{report}")
66
+ _UNSUBSTITUTED_PLACEHOLDER_RE = re.compile(
67
+ "|".join(re.escape(tok) for tok in _KNOWN_LAYOUT_PLACEHOLDERS)
68
+ )
50
69
 
51
70
  #: Default wall-clock cap for a single stack command slot. A slot that exceeds it is
52
71
  #: RED (a timeout is never green), never a hang that blocks the gate forever. Mirrors
@@ -78,6 +97,21 @@ class StackCommandMaterializationError(RuntimeError):
78
97
  """
79
98
 
80
99
 
100
+ class StackCommandClassificationError(StackContractConflictError):
101
+ """A composed command slot has NO execution classification (Contract Kernel v2.77g).
102
+
103
+ Raised by :func:`stack_command_plan` when ``contract.commands`` carries a slot id that
104
+ is in NEITHER :data:`codd.stack.compose.VERIFICATION_SLOTS` (executed as a release
105
+ check) NOR :data:`codd.stack.compose.NON_VERIFICATION_SLOTS` (a known lifecycle/
106
+ convenience slot deliberately excluded). The harness does NOT guess: an unknown slot
107
+ could be a genuine verification the plan would otherwise SILENTLY DROP (a false-green)
108
+ or a long-running server it would HANG on. So an unclassified slot is RED at plan
109
+ build, forcing the profile to classify every command it declares. Subclasses
110
+ :class:`StackContractConflictError` so the existing call-sites (greenfield pipeline +
111
+ verify CLI), which already translate that to their context's RED, catch it unchanged.
112
+ """
113
+
114
+
81
115
  #: Harness-owned directory (under the project) where a stack command's CURRENT-RUN
82
116
  #: report evidence is teed (for ``capture: stdout`` commands — ``npx playwright test
83
117
  #: --reporter=json`` streams its report to stdout). A per-slot file under here is the
@@ -92,6 +126,28 @@ def _owner_sort_key(owner: str, slot_id: str) -> tuple[int, str, str]:
92
126
  return (_OWNER_KIND_ORDER.get(kind, len(_OWNER_KIND_ORDER)), owner, slot_id)
93
127
 
94
128
 
129
+ def _unsubstituted_placeholders(slot: "StackCommandSlot") -> list[str]:
130
+ """Human labels for any ``{placeholder}`` the plan-build substitution did not resolve.
131
+
132
+ Empty ⇒ every cwd/argv/env value is concrete (safe to spawn). A non-empty list means
133
+ a slot still carries a literal ``{...}`` (the resolved stack layout had no value for
134
+ it) — the executor fails closed rather than spawn in an unresolved path. ``report_path``
135
+ is the slot's resolved evidence target and is checked too (a literal ``{report}`` there
136
+ would desync writer/reader)."""
137
+ problems: list[str] = []
138
+ if _UNSUBSTITUTED_PLACEHOLDER_RE.search(slot.cwd or ""):
139
+ problems.append(f"cwd={slot.cwd!r}")
140
+ for arg in slot.argv:
141
+ if _UNSUBSTITUTED_PLACEHOLDER_RE.search(arg or ""):
142
+ problems.append(f"argv:{arg!r}")
143
+ for key, value in slot.env.items():
144
+ if _UNSUBSTITUTED_PLACEHOLDER_RE.search(str(value)):
145
+ problems.append(f"env[{key}]={value!r}")
146
+ if _UNSUBSTITUTED_PLACEHOLDER_RE.search(slot.report_path or ""):
147
+ problems.append(f"report_path={slot.report_path!r}")
148
+ return problems
149
+
150
+
95
151
  def stack_command_evidence_path(slot: "StackCommandSlot", project_root: Path) -> Path:
96
152
  """The deterministic per-slot current-run report evidence file (``capture: stdout``).
97
153
 
@@ -235,16 +291,69 @@ class StackCommandPlan:
235
291
  }
236
292
 
237
293
 
238
- def _slot_from_command(slot_id: str, owner: str, spec: CommandSpec) -> StackCommandSlot:
294
+ def _substitute_stack_placeholders(
295
+ value: str | None, layout: StackLayout, *, report_path: str | None
296
+ ) -> str | None:
297
+ """Resolve a stack command's layout placeholders (cwd/argv/env), report-aware.
298
+
299
+ Reuses :func:`codd.languages.verify_plan._substitute_layout_placeholders` for the
300
+ shared roots (``{module_root}`` / ``{repo_root}`` / ``{manifest_root}``) — the SAME
301
+ helper the language verify executor + the oracle install-preflight use (the v2.75/
302
+ v2.76 fix) — then resolves the two stack-command extras the language helper does not:
303
+
304
+ * ``{test_root}`` — the resolved test tree root (a ``verify`` slot runs
305
+ ``vitest run {test_root}``); from :attr:`StackLayout.test_root`.
306
+ * ``{report}`` — the slot's OWN declared ``report_path`` (a ``verify`` slot writes
307
+ ``--outputFile={report}``). It MUST resolve to exactly ``report_path`` so the
308
+ command's ``--outputFile`` and the authenticity/obligation reader (which reads
309
+ ``slot.report_path``) name the SAME file — a mismatch would make the reader see a
310
+ missing report (false-RED) or read a stale one (false-green). Both are resolved
311
+ relative to the run cwd, which is ``module_root`` for both writer and reader, so a
312
+ relative ``report_path`` lands at one absolute path. ``{report}`` with no declared
313
+ ``report_path`` is left literal → the unsubstituted→RED guard fires (a command
314
+ that writes a report MUST declare where, or it cannot be observed).
315
+ """
316
+ if value is None:
317
+ return None
318
+ resolved = _substitute_layout_placeholders(value, layout)
319
+ assert resolved is not None # value was not None
320
+ resolved = resolved.replace("{test_root}", layout.test_root)
321
+ if report_path is not None:
322
+ resolved = resolved.replace("{report}", report_path)
323
+ return resolved
324
+
325
+
326
+ def _slot_from_command(
327
+ slot_id: str, owner: str, spec: CommandSpec, layout: StackLayout
328
+ ) -> StackCommandSlot:
329
+ """Build a slot, SUBSTITUTING its layout placeholders at plan-build time.
330
+
331
+ Substitution happens HERE (build time), not in the executor, because the plan is a
332
+ shared artifact: the authenticity gate and the obligation gate ALSO rebuild the plan
333
+ (:func:`stack_command_plan`) and read ``slot.cwd`` (``project_root / slot.cwd``) +
334
+ ``slot.report_path`` to locate the report. If substitution lived only in the
335
+ executor, those READERS would still see a literal ``{module_root}`` and resolve the
336
+ wrong path — re-introducing the bug on the read side. Baking the resolved values into
337
+ the slot makes ALL THREE consumers agree on one resolved truth. A placeholder the
338
+ layout could not resolve is LEFT literal here and fails closed at execution (the
339
+ executor refuses to spawn in a literal ``{...}`` dir — RED, never a silent pass).
340
+ """
239
341
  report = spec.report
342
+ report_path = report.path if report else None
240
343
  return StackCommandSlot(
241
344
  slot_id=slot_id,
242
345
  owner=owner,
243
- argv=tuple(spec.argv),
244
- cwd=spec.cwd,
245
- env={str(k): str(v) for k, v in spec.env.items()},
346
+ argv=tuple(
347
+ _substitute_stack_placeholders(a, layout, report_path=report_path) or ""
348
+ for a in spec.argv
349
+ ),
350
+ cwd=_substitute_stack_placeholders(spec.cwd, layout, report_path=report_path),
351
+ env={
352
+ str(k): (_substitute_stack_placeholders(str(v), layout, report_path=report_path) or "")
353
+ for k, v in spec.env.items()
354
+ },
246
355
  requires_materialized_deps=bool(spec.requires_materialized_deps),
247
- report_path=(report.path if report else None),
356
+ report_path=report_path,
248
357
  report_adapter=(report.adapter if report else None),
249
358
  report_capture=(report.capture if report else None),
250
359
  )
@@ -258,12 +367,52 @@ def stack_command_plan(contract: ResolvedStackContract) -> StackCommandPlan:
258
367
  :class:`StackCommandSlot` carrying its owning namespace, ordered deterministically
259
368
  by owner kind (language → framework → addon) then owner then slot id. No
260
369
  framework-name literal: the plan is a pure projection of the resolved contract.
370
+
371
+ Contract Kernel v2.77g — THREE-STATE slot classification (GPT-5.5 Pro consult
372
+ 2026-06-21). Every composed command slot is EITHER:
373
+
374
+ * a VERIFICATION slot (:data:`codd.stack.compose.VERIFICATION_SLOTS`) → materialized +
375
+ executed as a release check (build / typecheck / unit/integration/e2e test / lint /
376
+ coverage / read-only migration check). The set is audited to contain
377
+ ``framework_build``/``build`` so the framework production build the ignoreBuildErrors
378
+ obligation is enforced against is never silently dropped.
379
+ * a KNOWN non-verification slot (:data:`codd.stack.compose.NON_VERIFICATION_SLOTS`) →
380
+ EXCLUDED from the plan: ``dev`` / ``start`` (a long-running SERVER that never exits →
381
+ would HANG the gate at the per-slot timeout), ``generate`` / ``migrate`` (codegen /
382
+ mutating convenience, not a proof). Never spawned by ``codd verify`` / the greenfield
383
+ verify stage.
384
+ * UNKNOWN (in neither set) → RED (:class:`StackCommandClassificationError`). The
385
+ harness does NOT guess: silently dropping an unknown slot could hide a genuine
386
+ verification (a false-green), and blindly executing one could hang on a server. An
387
+ unclassified slot forces the profile to declare its intent.
388
+
389
+ Slot ``cwd``/``argv``/``env`` layout placeholders are substituted at plan build (see
390
+ :func:`_slot_from_command`).
261
391
  """
262
392
  assert_stack_contract_clean(contract)
263
393
  owners = contract.command_owners
394
+ layout = contract.layout
395
+
396
+ unclassified = sorted(
397
+ slot_id
398
+ for slot_id in contract.commands
399
+ if slot_id not in VERIFICATION_SLOTS and slot_id not in NON_VERIFICATION_SLOTS
400
+ )
401
+ if unclassified:
402
+ raise StackCommandClassificationError(
403
+ f"stack command classification ({contract.stack_id}): command slot(s) "
404
+ f"{unclassified} are in neither the verification-execution allowlist nor the "
405
+ "known non-verification (lifecycle/convenience) set — the harness will not "
406
+ "guess. An unclassified slot is RED at plan build: executing it could hang "
407
+ "(a server), and silently excluding it could drop a real verification (a "
408
+ "false-green). Classify the slot in codd.stack.compose (VERIFICATION_SLOTS or "
409
+ "NON_VERIFICATION_SLOTS)."
410
+ )
411
+
264
412
  slots = [
265
- _slot_from_command(slot_id, owners.get(slot_id, ""), spec)
413
+ _slot_from_command(slot_id, owners.get(slot_id, ""), spec, layout)
266
414
  for slot_id, spec in contract.commands.items()
415
+ if slot_id in VERIFICATION_SLOTS
267
416
  ]
268
417
  slots.sort(key=lambda s: _owner_sort_key(s.owner, s.slot_id))
269
418
  return StackCommandPlan(
@@ -352,6 +501,29 @@ def default_stack_command_executor(
352
501
  layer parses the current run's report. This is capture TRANSPORT only — the
353
502
  parser/observation lives outside the executor.
354
503
  """
504
+ # Unsubstituted-placeholder guard (Contract Kernel v2.77g; the v2.75 cwd-bug class):
505
+ # the plan substitutes layout placeholders at build time, but a placeholder the layout
506
+ # could not resolve is left literal. Refuse to spawn in a literal ``{...}`` dir / with
507
+ # a literal ``{...}`` argv or env value — that is RED (spawn-refused), never a silent
508
+ # pass and never a spawn in a wrong dir. Mirrors
509
+ # :func:`codd.languages.oracle_executor.run_command_sequence` step (3).
510
+ unresolved = _unsubstituted_placeholders(slot)
511
+ if unresolved:
512
+ return StackCommandSlotResult(
513
+ slot_id=slot.slot_id,
514
+ owner=slot.owner,
515
+ command_str=slot.command_str,
516
+ spawned=False,
517
+ returncode=None,
518
+ timed_out=False,
519
+ detail=(
520
+ f"stack command slot {slot.slot_id!r} has unsubstituted layout "
521
+ f"placeholder(s) {unresolved}; refusing to spawn in an unresolved path "
522
+ "(a literal '{...}' cwd/argv/env is the v2.75 cwd-bug class — RED, not a "
523
+ "benign miss). The resolved stack layout did not provide a value for it."
524
+ ),
525
+ )
526
+
355
527
  cwd = (project_root / slot.cwd) if slot.cwd else project_root
356
528
  env = os.environ.copy()
357
529
  env.update(slot.env)
@@ -33,8 +33,64 @@ from typing import Any, Literal, Mapping, Sequence
33
33
  from codd.languages.profile import CommandSpec, LanguageProfile
34
34
  from .profile import AddonProfile, FileRole, FrameworkProfile, Obligation, SourceSet
35
35
 
36
+
37
+ @dataclass(frozen=True)
38
+ class StackLayout:
39
+ """The resolved layout roots the harness needs to RUN a composed command.
40
+
41
+ Contract Kernel v2.77g. A composed command slot's ``cwd``/``argv``/``env`` may
42
+ carry LITERAL layout placeholders (``{module_root}`` / ``{repo_root}`` /
43
+ ``{manifest_root}`` / ``{test_root}``) exactly like a language verify command — the
44
+ profile keeps them as templates (full template substitution is PathPlanner's job).
45
+ But the executor must spawn in a REAL directory and write its report to a REAL path,
46
+ so the resolved contract carries the layout roots the plan substitutes at build time
47
+ (the stack twin of :class:`codd.languages.profile.LayoutSpec` +
48
+ :func:`codd.languages.verify_plan._substitute_layout_placeholders`).
49
+
50
+ Sourced from the LANGUAGE profile's layout in :func:`compose` (the language owns
51
+ repo topology + test sets; a framework CONTRIBUTES source sets but not the module/
52
+ repo roots). ``test_roots`` carries EVERY declared test set's root so the plan can
53
+ resolve ``{test_root}`` deterministically — a stack's ``verify`` runs the whole test
54
+ tree from ONE root, so a profile with zero OR multiple test roots makes ``{test_root}``
55
+ AMBIGUOUS and the plan reds (rather than guessing — GPT-5.5 Pro consult 2026-06-21).
56
+ The convenience :attr:`test_root` is the single root when exactly one is declared (the
57
+ common case), else ``""`` (the substitution then leaves ``{test_root}`` unresolved →
58
+ the unsubstituted→RED guard fires). NOT part of
59
+ :attr:`ResolvedStackContract.content_hash`: it is fully DERIVED from the already-pinned
60
+ language layer (whose digest is in ``layers``), so it cannot drift independently of a
61
+ pinned stack — folding it into the hash would only spuriously break a committed lock
62
+ when nothing the lock protects changed.
63
+ """
64
+
65
+ module_root: str = "."
66
+ repo_root: str = "."
67
+ manifest_root: str = "."
68
+ test_roots: tuple[str, ...] = ()
69
+
70
+ @property
71
+ def test_root(self) -> str:
72
+ """The single unambiguous test root, or ``""`` when zero/multiple are declared.
73
+
74
+ ``{test_root}`` substitution uses this; ``""`` deliberately leaves the placeholder
75
+ unresolved so the executor's unsubstituted→RED guard fires (an ambiguous test root
76
+ must not be silently guessed — anti-false-green)."""
77
+ return self.test_roots[0] if len(self.test_roots) == 1 else ""
78
+
36
79
  #: Verification command slots — a green in one NEVER implies another (design §207).
37
80
  #: A cross-layer redefinition of one of these with different argv is a conflict.
81
+ #:
82
+ #: This is ALSO the materialization allowlist (Contract Kernel v2.77g): the command
83
+ #: plan executes ONLY these slots, so a non-verification convenience slot a framework
84
+ #: declares (``dev`` / ``start`` — a long-running SERVER that never exits, ``generate``
85
+ #: / ``migrate`` — a mutating convenience) is NEVER spawned by ``codd verify`` (running
86
+ #: a server slot would hang the gate forever). Every slot that GENUINELY verifies must
87
+ #: be in this set or it would be dropped — and a dropped verification = "not verified" =
88
+ #: a false-green. So this set is the SINGLE source of truth for "which composed slot is
89
+ #: a release check", and it MUST contain every build/test/static check: ``framework_build``
90
+ #: / ``build`` (a framework's production build — the ``no_ignore_build_errors_as_typecheck``
91
+ #: obligation is enforced AGAINST it being run, so dropping it would be the exact
92
+ #: false-green the obligation exists to kill). ``migration_check`` / ``migration_status``
93
+ #: (READ-ONLY drift checks) stay verification.
38
94
  VERIFICATION_SLOTS = frozenset(
39
95
  {
40
96
  "typecheck",
@@ -44,12 +100,42 @@ VERIFICATION_SLOTS = frozenset(
44
100
  "coverage",
45
101
  "lint",
46
102
  "e2e_test",
103
+ "build",
104
+ "framework_build",
47
105
  "migration_check",
48
106
  "migration_status",
49
107
  "eval",
50
108
  }
51
109
  )
52
110
 
111
+ #: KNOWN non-verification command slots — a framework/addon legitimately declares these
112
+ #: (a dev/start SERVER, a codegen/migration convenience) but they are NOT release checks,
113
+ #: so the command plan EXCLUDES them (a server would hang the gate; a mutating migration
114
+ #: must never run during verify). This is the OTHER half of the three-state slot model
115
+ #: (GPT-5.5 Pro consult 2026-06-21): a slot id is EITHER a verification slot (executed),
116
+ #: OR a known non-verification slot (excluded), OR UNKNOWN. An UNKNOWN slot id (in neither
117
+ #: set) is NOT silently dropped — that would be a false-green if it were a real check the
118
+ #: harness did not recognize — it is RED at plan build (``stack_command_plan`` raises),
119
+ #: forcing a profile to CLASSIFY every command it declares. ``generate`` (codegen) and
120
+ #: ``migrate_deploy`` (mutating apply) / ``migrate`` are non-proof-bearing convenience;
121
+ #: ``dev`` / ``start`` are servers. Mirrors the authenticity layer's own classification
122
+ #: of these ids as non-verification (``DEFAULT_STACK_COMMAND_OBSERVATION_POLICIES``).
123
+ NON_VERIFICATION_SLOTS = frozenset(
124
+ {
125
+ "dev",
126
+ "start",
127
+ "serve",
128
+ "preview",
129
+ "generate",
130
+ "migrate",
131
+ "migrate_deploy",
132
+ "migrate_status",
133
+ "install",
134
+ "format",
135
+ "clean",
136
+ }
137
+ )
138
+
53
139
  def _normalize_checker_ref(ref: str | None) -> str:
54
140
  """Canonical form of an obligation ``checker`` ref for redefinition comparison.
55
141
 
@@ -182,6 +268,16 @@ class ResolvedStackContract:
182
268
  #: (``Any``) to keep ``compose`` import-cycle-free at the dataclass level. Empty for the
183
269
  #: curated stacks (no profile declares a replacement yet).
184
270
  pending_replacement_proofs: tuple[Any, ...] = ()
271
+ #: Resolved layout roots (Contract Kernel v2.77g) — the real directories/paths the
272
+ #: command plan substitutes for a slot's ``{module_root}`` / ``{repo_root}`` /
273
+ #: ``{manifest_root}`` / ``{test_root}`` placeholders so a composed command spawns in
274
+ #: a real dir and writes its report to a real path (the stack twin of the language
275
+ #: verify executor's layout substitution). Sourced from the LANGUAGE profile's layout
276
+ #: in :func:`compose`. NOT part of ``content_hash`` (see :class:`StackLayout`): it is
277
+ #: derived from the already-pinned language layer, so it cannot drift independently of
278
+ #: a pinned stack. Defaulted so an unparameterized contract (and every existing test
279
+ #: constructing a contract directly) is unaffected.
280
+ layout: StackLayout = field(default_factory=StackLayout)
185
281
 
186
282
  @property
187
283
  def is_clean(self) -> bool:
@@ -427,6 +523,20 @@ def compose(
427
523
  fw.id: tuple(v.id for v in fw.variants) for fw in frameworks if fw.variants
428
524
  }
429
525
 
526
+ # -- resolved layout (Contract Kernel v2.77g) ------------------------------
527
+ # The LANGUAGE owns repo topology + test sets; copy the roots the command plan
528
+ # needs to substitute a slot's {module_root}/{repo_root}/{manifest_root}/{test_root}.
529
+ # Carry ALL test roots so the plan can detect an ambiguous {test_root} (zero/multiple)
530
+ # and RED rather than guess. Derived from the language layer, NOT hashed.
531
+ lang_layout = language.layout
532
+ test_sets = getattr(lang_layout, "test_sets", ()) or ()
533
+ stack_layout = StackLayout(
534
+ module_root=lang_layout.module_root,
535
+ repo_root=lang_layout.repo_root,
536
+ manifest_root=lang_layout.manifest_root,
537
+ test_roots=tuple(ts.root for ts in test_sets),
538
+ )
539
+
430
540
  stack_id = "+".join(l.id for l in layers)
431
541
  content_hash = _content_hash(
432
542
  layers, commands, obligations, file_roles, source_sets, pending_proofs
@@ -447,4 +557,5 @@ def compose(
447
557
  conflicts=tuple(conflicts),
448
558
  content_hash=content_hash,
449
559
  pending_replacement_proofs=tuple(pending_proofs),
560
+ layout=stack_layout,
450
561
  )
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "codd-dev"
7
- version = "2.97.0"
7
+ version = "2.98.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
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes