codd-dev 2.27.0__tar.gz → 2.28.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 (570) hide show
  1. {codd_dev-2.27.0 → codd_dev-2.28.0}/PKG-INFO +1 -1
  2. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/__init__.py +1 -1
  3. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/defaults.yaml +19 -3
  4. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/implement_oracle.py +384 -22
  5. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/implement_oracle_scope.py +277 -0
  6. {codd_dev-2.27.0 → codd_dev-2.28.0}/pyproject.toml +1 -1
  7. {codd_dev-2.27.0 → codd_dev-2.28.0}/.gitignore +0 -0
  8. {codd_dev-2.27.0 → codd_dev-2.28.0}/LICENSE +0 -0
  9. {codd_dev-2.27.0 → codd_dev-2.28.0}/README.md +0 -0
  10. {codd_dev-2.27.0 → codd_dev-2.28.0}/bench_fixture/README.md +0 -0
  11. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/__main__.py +0 -0
  12. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/_git_helper.py +0 -0
  13. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/action_outcome.py +0 -0
  14. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/ai_invoke.py +0 -0
  15. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/ai_patch.py +0 -0
  16. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/artifact_contract.py +0 -0
  17. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/artifact_ids.py +0 -0
  18. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/artifacts/catalog.yaml +0 -0
  19. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/ask_user_question_adapter.py +0 -0
  20. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/assembler.py +0 -0
  21. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/bridge.py +0 -0
  22. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/brownfield/__init__.py +0 -0
  23. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/brownfield/pipeline.py +0 -0
  24. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/capability_completeness.py +0 -0
  25. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/claude_cli.py +0 -0
  26. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/cli.py +0 -0
  27. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/clustering.py +0 -0
  28. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/coherence_adapters.py +0 -0
  29. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/coherence_engine.py +0 -0
  30. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/confidence.py +0 -0
  31. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/config.py +0 -0
  32. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/config_schema.py +0 -0
  33. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/contracts.py +0 -0
  34. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/coverage_auditor.py +0 -0
  35. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/coverage_metrics.py +0 -0
  36. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/dag/__init__.py +0 -0
  37. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/dag/auto_repair.py +0 -0
  38. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/dag/builder.py +0 -0
  39. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/dag/checks/__init__.py +0 -0
  40. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/dag/checks/_one_to_many_detection.py +0 -0
  41. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/dag/checks/artifact_contract_check.py +0 -0
  42. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/dag/checks/ci_health.py +0 -0
  43. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/dag/checks/dependency_freshness.py +0 -0
  44. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/dag/checks/depends_on_consistency.py +0 -0
  45. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/dag/checks/deployment_completeness.py +0 -0
  46. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/dag/checks/edge_validity.py +0 -0
  47. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/dag/checks/environment_coverage.py +0 -0
  48. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/dag/checks/implementation_coverage.py +0 -0
  49. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/dag/checks/node_completeness.py +0 -0
  50. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/dag/checks/opt_out.py +0 -0
  51. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/dag/checks/task_completion.py +0 -0
  52. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/dag/checks/transitive_closure.py +0 -0
  53. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/dag/checks/ui_coherence.py +0 -0
  54. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/dag/checks/user_journey_coherence.py +0 -0
  55. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/dag/coverage_axes.py +0 -0
  56. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/dag/defaults/cli.yaml +0 -0
  57. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/dag/defaults/cpp_embedded.yaml +0 -0
  58. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/dag/defaults/csharp.yaml +0 -0
  59. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/dag/defaults/elixir.yaml +0 -0
  60. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/dag/defaults/generic.yaml +0 -0
  61. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/dag/defaults/iot.yaml +0 -0
  62. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/dag/defaults/java.yaml +0 -0
  63. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/dag/defaults/kotlin.yaml +0 -0
  64. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/dag/defaults/mobile.yaml +0 -0
  65. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/dag/defaults/ruby.yaml +0 -0
  66. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/dag/defaults/rust.yaml +0 -0
  67. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/dag/defaults/scala.yaml +0 -0
  68. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/dag/defaults/swift.yaml +0 -0
  69. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/dag/defaults/test_frameworks.yaml +0 -0
  70. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/dag/defaults/web.yaml +0 -0
  71. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/dag/extractor.py +0 -0
  72. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/dag/impact.py +0 -0
  73. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/dag/runner.py +0 -0
  74. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/defaults.py +0 -0
  75. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/dependency_lock_coherence.py +0 -0
  76. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/deploy_targets/__init__.py +0 -0
  77. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/deploy_targets/app_service.py +0 -0
  78. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/deploy_targets/base.py +0 -0
  79. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/deploy_targets/docker_compose.py +0 -0
  80. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/deployer.py +0 -0
  81. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/deployment/__init__.py +0 -0
  82. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/deployment/checks/__init__.py +0 -0
  83. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/deployment/defaults/deploy_targets.yaml +0 -0
  84. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/deployment/defaults/runtime_capability_inference.yaml +0 -0
  85. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/deployment/defaults/schema_providers.yaml +0 -0
  86. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/deployment/defaults/verification_templates.yaml +0 -0
  87. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/deployment/extractor.py +0 -0
  88. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/deployment/providers/__init__.py +0 -0
  89. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/deployment/providers/ai_command.py +0 -0
  90. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/deployment/providers/ai_command_factory.py +0 -0
  91. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/deployment/providers/codex_app_server.py +0 -0
  92. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/deployment/providers/llm_consideration.py +0 -0
  93. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/deployment/providers/schema/__init__.py +0 -0
  94. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/deployment/providers/schema/prisma.py +0 -0
  95. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/deployment/providers/target/__init__.py +0 -0
  96. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/deployment/providers/target/docker_compose.py +0 -0
  97. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/deployment/providers/verification/__init__.py +0 -0
  98. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/deployment/providers/verification/assertion_handlers.py +0 -0
  99. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/deployment/providers/verification/cdp_browser.py +0 -0
  100. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/deployment/providers/verification/cdp_engines.py +0 -0
  101. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/deployment/providers/verification/cdp_launchers.py +0 -0
  102. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/deployment/providers/verification/cdp_wire.py +0 -0
  103. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/deployment/providers/verification/curl.py +0 -0
  104. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/deployment/providers/verification/form_strategies.py +0 -0
  105. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/deployment/providers/verification/means_catalog.py +0 -0
  106. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/deployment/providers/verification/playwright.py +0 -0
  107. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/deployment/providers/verification/vitest.py +0 -0
  108. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/design_md.py +0 -0
  109. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/diff/__init__.py +0 -0
  110. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/diff/apply.py +0 -0
  111. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/diff/engine.py +0 -0
  112. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/diff/persistence.py +0 -0
  113. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/diff/templates/diff_prompt.md +0 -0
  114. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/discovery.py +0 -0
  115. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/drift.py +0 -0
  116. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/e2e_contract_coherence.py +0 -0
  117. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/e2e_extractor.py +0 -0
  118. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/e2e_generator.py +0 -0
  119. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/e2e_runner.py +0 -0
  120. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/elicit/__init__.py +0 -0
  121. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/elicit/apply.py +0 -0
  122. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/elicit/engine.py +0 -0
  123. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/elicit/finding.py +0 -0
  124. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/elicit/formatters/__init__.py +0 -0
  125. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/elicit/formatters/base.py +0 -0
  126. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/elicit/formatters/interactive.py +0 -0
  127. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/elicit/formatters/json_fmt.py +0 -0
  128. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/elicit/formatters/md.py +0 -0
  129. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/elicit/lexicon_loader.py +0 -0
  130. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/elicit/persistence.py +0 -0
  131. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/elicit/templates/elicit_prompt_L0.md +0 -0
  132. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/env_refs.py +0 -0
  133. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/extract_ai.py +0 -0
  134. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/extract_paths.py +0 -0
  135. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/extractor.py +0 -0
  136. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/fix/__init__.py +0 -0
  137. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/fix/candidate_selector.py +0 -0
  138. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/fix/design_updater.py +0 -0
  139. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/fix/impl_propagation.py +0 -0
  140. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/fix/interactive_prompt.py +0 -0
  141. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/fix/phenomenon_fixer.py +0 -0
  142. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/fix/phenomenon_parser.py +0 -0
  143. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/fix/risk_classifier.py +0 -0
  144. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/fix/templates/clarification_question.txt +0 -0
  145. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/fix/templates/design_update.txt +0 -0
  146. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/fix/templates/impl_update.txt +0 -0
  147. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/fix/templates/phenomenon_parse.txt +0 -0
  148. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/fix/templates/risk_assessment.txt +0 -0
  149. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/fix/templates_loader.py +0 -0
  150. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/fixer.py +0 -0
  151. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/fixup_drift.py +0 -0
  152. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/fixup_drift_strategies/__init__.py +0 -0
  153. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/fixup_drift_strategies/design_token_drift.py +0 -0
  154. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/fixup_drift_strategies/lexicon_violation.py +0 -0
  155. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/fixup_drift_strategies/url_drift.py +0 -0
  156. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/frontmatter.py +0 -0
  157. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/generator.py +0 -0
  158. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/git_evidence.py +0 -0
  159. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/graph.py +0 -0
  160. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/greenfield/__init__.py +0 -0
  161. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/greenfield/pipeline.py +0 -0
  162. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/hitl_session.py +0 -0
  163. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/hooks/__init__.py +0 -0
  164. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/hooks/pre-commit +0 -0
  165. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/hooks/recipes/claude_requirements_nudge.json +0 -0
  166. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/hooks/recipes/claude_settings_example.json +0 -0
  167. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/hooks/recipes/codex_hook.sh +0 -0
  168. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/hooks/recipes/git_post_commit.sh +0 -0
  169. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/hooks/recipes/git_pre_commit.sh +0 -0
  170. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/iac_nfr.py +0 -0
  171. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/implementer/__init__.py +0 -0
  172. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/implementer/chunked_runner.py +0 -0
  173. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/implementer/typecheck_loop.py +0 -0
  174. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/implementer.py +0 -0
  175. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/import_coherence.py +0 -0
  176. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/inheritance.py +0 -0
  177. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/init/__init__.py +0 -0
  178. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/init/lexicon_suggest.py +0 -0
  179. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/init/llm_lexicon_suggester.py +0 -0
  180. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/init/stack_detector.py +0 -0
  181. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/knowledge_fetcher.py +0 -0
  182. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/lexicon.py +0 -0
  183. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/lexicon_cli/__init__.py +0 -0
  184. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/lexicon_cli/formatters/__init__.py +0 -0
  185. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/lexicon_cli/formatters/html.py +0 -0
  186. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/lexicon_cli/formatters/json_fmt.py +0 -0
  187. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/lexicon_cli/formatters/md.py +0 -0
  188. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/lexicon_cli/inspector.py +0 -0
  189. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/lexicon_cli/manager.py +0 -0
  190. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/lexicon_cli/reporter.py +0 -0
  191. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/lexicon_cli/threshold.py +0 -0
  192. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/llm/__init__.py +0 -0
  193. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/llm/approval.py +0 -0
  194. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/llm/best_practice_augmenter.py +0 -0
  195. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/llm/criteria_expander.py +0 -0
  196. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/llm/design_doc_extractor.py +0 -0
  197. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/llm/impl_step_deriver.py +0 -0
  198. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/llm/means_catalog_loader.py +0 -0
  199. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/llm/parser.py +0 -0
  200. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/llm/plan_deriver.py +0 -0
  201. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/llm/prompt_builder.py +0 -0
  202. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/llm/strategy_validator.py +0 -0
  203. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/llm/templates/best_practice_augment_meta.md +0 -0
  204. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/llm/templates/criteria_expand_meta.md +0 -0
  205. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/llm/templates/design_doc_extract_meta.md +0 -0
  206. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/llm/templates/impl_step_derive_meta.md +0 -0
  207. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/llm/templates/implementation_step_catalog.yaml +0 -0
  208. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/llm/templates/meta_instruction.md +0 -0
  209. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/llm/templates/plan_derive_meta.md +0 -0
  210. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/llm/templates/verification_means_catalog.yaml +0 -0
  211. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/mcp_server.py +0 -0
  212. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/measure.py +0 -0
  213. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/operational_e2e_audit.py +0 -0
  214. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/operations_derive.py +0 -0
  215. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/parsing/__init__.py +0 -0
  216. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/parsing/_shared.py +0 -0
  217. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/parsing/api_specs.py +0 -0
  218. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/parsing/filesystem_routes.py +0 -0
  219. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/parsing/iac.py +0 -0
  220. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/parsing/python_ast.py +0 -0
  221. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/parsing/schemas.py +0 -0
  222. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/parsing/tests_builddeps.py +0 -0
  223. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/parsing/treesitter.py +0 -0
  224. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/planner.py +0 -0
  225. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/policy.py +0 -0
  226. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/preflight/__init__.py +0 -0
  227. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/preflight/defaults/cli.yaml +0 -0
  228. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/preflight/defaults/generic.yaml +0 -0
  229. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/preflight/defaults/iot.yaml +0 -0
  230. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/preflight/defaults/mobile.yaml +0 -0
  231. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/preflight/defaults/web.yaml +0 -0
  232. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/project_types.py +0 -0
  233. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/propagate.py +0 -0
  234. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/propagation_common.py +0 -0
  235. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/propagator.py +0 -0
  236. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/reconciliation_ledger.py +0 -0
  237. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/registry.py +0 -0
  238. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/repair/__init__.py +0 -0
  239. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/repair/approval_repair.py +0 -0
  240. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/repair/auto_scope_guard.py +0 -0
  241. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/repair/engine.py +0 -0
  242. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/repair/git_patcher.py +0 -0
  243. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/repair/history.py +0 -0
  244. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/repair/llm_repair_engine.py +0 -0
  245. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/repair/loop.py +0 -0
  246. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/repair/primary_picker.py +0 -0
  247. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/repair/proof_breaks.py +0 -0
  248. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/repair/repair_result.py +0 -0
  249. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/repair/repairability_classifier.py +0 -0
  250. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/repair/schema.py +0 -0
  251. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/repair/templates/analyze_meta.md +0 -0
  252. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/repair/templates/propose_meta.md +0 -0
  253. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/repair/templates/repair_strategy_meta.md +0 -0
  254. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/repair/templates/repairability_meta.md +0 -0
  255. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/repair/test_failure_attribution.py +0 -0
  256. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/repair/verify_runner.py +0 -0
  257. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/repair_slice.py +0 -0
  258. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/require.py +0 -0
  259. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/require_plugins.py +0 -0
  260. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/require_propagate.py +0 -0
  261. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/required_artifacts/defaults/cli.yaml +0 -0
  262. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/required_artifacts/defaults/generic.yaml +0 -0
  263. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/required_artifacts/defaults/iot.yaml +0 -0
  264. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/required_artifacts/defaults/mobile.yaml +0 -0
  265. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/required_artifacts/defaults/web.yaml +0 -0
  266. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/required_artifacts_deriver.py +0 -0
  267. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/requirement_completeness/defaults/cli.yaml +0 -0
  268. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/requirement_completeness/defaults/generic.yaml +0 -0
  269. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/requirement_completeness/defaults/iot.yaml +0 -0
  270. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/requirement_completeness/defaults/mobile.yaml +0 -0
  271. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/requirement_completeness/defaults/web.yaml +0 -0
  272. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/requirement_completeness_auditor.py +0 -0
  273. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/requirement_reconciliation.py +0 -0
  274. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/requirements_meta.py +0 -0
  275. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/restoration_report.py +0 -0
  276. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/restore.py +0 -0
  277. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/routes_extractor.py +0 -0
  278. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/runtime_smoke/__init__.py +0 -0
  279. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/runtime_smoke/checks.py +0 -0
  280. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/runtime_smoke/config.py +0 -0
  281. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/runtime_smoke/report.py +0 -0
  282. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/runtime_smoke/runner.py +0 -0
  283. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/scanner.py +0 -0
  284. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/schema_refs.py +0 -0
  285. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/screen_flow_validator.py +0 -0
  286. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/screen_transition_extractor.py +0 -0
  287. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/screen_transitions/defaults.yaml +0 -0
  288. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/skills_cli/__init__.py +0 -0
  289. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/skills_cli/discovery.py +0 -0
  290. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/skills_cli/manager.py +0 -0
  291. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/skills_cli/paths.py +0 -0
  292. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/surface_reconciliation.py +0 -0
  293. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/synth.py +0 -0
  294. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/templates/codd.yaml.tmpl +0 -0
  295. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/templates/conventions.yaml.tmpl +0 -0
  296. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/templates/data_dependencies.yaml.tmpl +0 -0
  297. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/templates/doc_links.yaml.tmpl +0 -0
  298. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/templates/extract_ai_prompt_baseline.md +0 -0
  299. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/templates/extracted/api-contract.md.j2 +0 -0
  300. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/templates/extracted/architecture-overview.md.j2 +0 -0
  301. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/templates/extracted/module-detail.md.j2 +0 -0
  302. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/templates/extracted/schema-design.md.j2 +0 -0
  303. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/templates/extracted/system-context.md.j2 +0 -0
  304. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/templates/gitignore.tmpl +0 -0
  305. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/templates/lexicon_questions.md +0 -0
  306. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/templates/lexicon_schema.yaml +0 -0
  307. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/templates/overrides.yaml.tmpl +0 -0
  308. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/test_detection.py +0 -0
  309. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/test_import_coherence.py +0 -0
  310. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/traceability.py +0 -0
  311. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/validator.py +0 -0
  312. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/verifiable_behavior_audit.py +0 -0
  313. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/watch/__init__.py +0 -0
  314. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/watch/events.py +0 -0
  315. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/watch/propagation_log.py +0 -0
  316. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/watch/propagation_pipeline.py +0 -0
  317. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/watch/test_runner.py +0 -0
  318. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/watch/watcher.py +0 -0
  319. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd/wiring.py +0 -0
  320. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ai_governance_eu_act/coverage_matrix.md +0 -0
  321. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ai_governance_eu_act/elicit_extend.md +0 -0
  322. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ai_governance_eu_act/lexicon.yaml +0 -0
  323. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ai_governance_eu_act/manifest.yaml +0 -0
  324. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ai_governance_eu_act/recommended_kinds.yaml +0 -0
  325. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ai_governance_eu_act/severity_rules.yaml +0 -0
  326. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/api_rate_limiting_caching/coverage_matrix.md +0 -0
  327. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/api_rate_limiting_caching/elicit_extend.md +0 -0
  328. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/api_rate_limiting_caching/lexicon.yaml +0 -0
  329. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/api_rate_limiting_caching/manifest.yaml +0 -0
  330. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/api_rate_limiting_caching/recommended_kinds.yaml +0 -0
  331. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/api_rate_limiting_caching/severity_rules.yaml +0 -0
  332. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/api_rest_openapi/coverage_matrix.md +0 -0
  333. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/api_rest_openapi/elicit_extend.md +0 -0
  334. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/api_rest_openapi/lexicon.yaml +0 -0
  335. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/api_rest_openapi/manifest.yaml +0 -0
  336. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/api_rest_openapi/recommended_kinds.yaml +0 -0
  337. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/api_rest_openapi/severity_rules.yaml +0 -0
  338. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/babok/elicit_extend.md +0 -0
  339. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/babok/lexicon.yaml +0 -0
  340. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/babok/manifest.yaml +0 -0
  341. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/babok/recommended_kinds.yaml +0 -0
  342. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/babok/severity_rules.yaml +0 -0
  343. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/backend_event_cloudevents/coverage_matrix.md +0 -0
  344. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/backend_event_cloudevents/elicit_extend.md +0 -0
  345. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/backend_event_cloudevents/lexicon.yaml +0 -0
  346. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/backend_event_cloudevents/manifest.yaml +0 -0
  347. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/backend_event_cloudevents/recommended_kinds.yaml +0 -0
  348. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/backend_event_cloudevents/severity_rules.yaml +0 -0
  349. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/backend_graphql/coverage_matrix.md +0 -0
  350. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/backend_graphql/elicit_extend.md +0 -0
  351. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/backend_graphql/lexicon.yaml +0 -0
  352. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/backend_graphql/manifest.yaml +0 -0
  353. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/backend_graphql/recommended_kinds.yaml +0 -0
  354. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/backend_graphql/severity_rules.yaml +0 -0
  355. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/backend_grpc_proto/coverage_matrix.md +0 -0
  356. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/backend_grpc_proto/elicit_extend.md +0 -0
  357. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/backend_grpc_proto/lexicon.yaml +0 -0
  358. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/backend_grpc_proto/manifest.yaml +0 -0
  359. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/backend_grpc_proto/recommended_kinds.yaml +0 -0
  360. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/backend_grpc_proto/severity_rules.yaml +0 -0
  361. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/compliance_hipaa/coverage_matrix.md +0 -0
  362. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/compliance_hipaa/elicit_extend.md +0 -0
  363. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/compliance_hipaa/lexicon.yaml +0 -0
  364. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/compliance_hipaa/manifest.yaml +0 -0
  365. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/compliance_hipaa/recommended_kinds.yaml +0 -0
  366. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/compliance_hipaa/severity_rules.yaml +0 -0
  367. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/compliance_iso27001/coverage_matrix.md +0 -0
  368. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/compliance_iso27001/elicit_extend.md +0 -0
  369. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/compliance_iso27001/lexicon.yaml +0 -0
  370. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/compliance_iso27001/manifest.yaml +0 -0
  371. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/compliance_iso27001/recommended_kinds.yaml +0 -0
  372. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/compliance_iso27001/severity_rules.yaml +0 -0
  373. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/compliance_pci_dss_4/coverage_matrix.md +0 -0
  374. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/compliance_pci_dss_4/elicit_extend.md +0 -0
  375. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/compliance_pci_dss_4/lexicon.yaml +0 -0
  376. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/compliance_pci_dss_4/manifest.yaml +0 -0
  377. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/compliance_pci_dss_4/recommended_kinds.yaml +0 -0
  378. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/compliance_pci_dss_4/severity_rules.yaml +0 -0
  379. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/data_aggregation_policies/coverage_matrix.md +0 -0
  380. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/data_aggregation_policies/elicit_extend.md +0 -0
  381. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/data_aggregation_policies/lexicon.yaml +0 -0
  382. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/data_aggregation_policies/manifest.yaml +0 -0
  383. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/data_aggregation_policies/recommended_kinds.yaml +0 -0
  384. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/data_aggregation_policies/severity_rules.yaml +0 -0
  385. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/coverage_matrix.md +0 -0
  386. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/elicit_extend.md +0 -0
  387. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/lexicon.yaml +0 -0
  388. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/manifest.yaml +0 -0
  389. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/recommended_kinds.yaml +0 -0
  390. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/severity_rules.yaml +0 -0
  391. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/data_governance_appi_gdpr/coverage_matrix.md +0 -0
  392. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/data_governance_appi_gdpr/elicit_extend.md +0 -0
  393. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/data_governance_appi_gdpr/lexicon.yaml +0 -0
  394. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/data_governance_appi_gdpr/manifest.yaml +0 -0
  395. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/data_governance_appi_gdpr/recommended_kinds.yaml +0 -0
  396. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/data_governance_appi_gdpr/severity_rules.yaml +0 -0
  397. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/data_nosql_jsonschema/coverage_matrix.md +0 -0
  398. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/data_nosql_jsonschema/elicit_extend.md +0 -0
  399. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/data_nosql_jsonschema/lexicon.yaml +0 -0
  400. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/data_nosql_jsonschema/manifest.yaml +0 -0
  401. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/data_nosql_jsonschema/recommended_kinds.yaml +0 -0
  402. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/data_nosql_jsonschema/severity_rules.yaml +0 -0
  403. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/data_relational_iso_sql/coverage_matrix.md +0 -0
  404. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/data_relational_iso_sql/elicit_extend.md +0 -0
  405. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/data_relational_iso_sql/lexicon.yaml +0 -0
  406. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/data_relational_iso_sql/manifest.yaml +0 -0
  407. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/data_relational_iso_sql/recommended_kinds.yaml +0 -0
  408. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/data_relational_iso_sql/severity_rules.yaml +0 -0
  409. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ddd_domain_driven_design/coverage_matrix.md +0 -0
  410. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ddd_domain_driven_design/elicit_extend.md +0 -0
  411. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ddd_domain_driven_design/lexicon.yaml +0 -0
  412. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ddd_domain_driven_design/manifest.yaml +0 -0
  413. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ddd_domain_driven_design/recommended_kinds.yaml +0 -0
  414. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ddd_domain_driven_design/severity_rules.yaml +0 -0
  415. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/dora_sre_metrics/coverage_matrix.md +0 -0
  416. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/dora_sre_metrics/elicit_extend.md +0 -0
  417. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/dora_sre_metrics/lexicon.yaml +0 -0
  418. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/dora_sre_metrics/manifest.yaml +0 -0
  419. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/dora_sre_metrics/recommended_kinds.yaml +0 -0
  420. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/dora_sre_metrics/severity_rules.yaml +0 -0
  421. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/i18n_unicode_cldr/coverage_matrix.md +0 -0
  422. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/i18n_unicode_cldr/elicit_extend.md +0 -0
  423. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/i18n_unicode_cldr/lexicon.yaml +0 -0
  424. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/i18n_unicode_cldr/manifest.yaml +0 -0
  425. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/i18n_unicode_cldr/recommended_kinds.yaml +0 -0
  426. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/i18n_unicode_cldr/severity_rules.yaml +0 -0
  427. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ml_model_cards/coverage_matrix.md +0 -0
  428. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ml_model_cards/elicit_extend.md +0 -0
  429. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ml_model_cards/lexicon.yaml +0 -0
  430. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ml_model_cards/manifest.yaml +0 -0
  431. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ml_model_cards/recommended_kinds.yaml +0 -0
  432. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ml_model_cards/severity_rules.yaml +0 -0
  433. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/mobile_a11y_native/coverage_matrix.md +0 -0
  434. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/mobile_a11y_native/elicit_extend.md +0 -0
  435. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/mobile_a11y_native/lexicon.yaml +0 -0
  436. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/mobile_a11y_native/manifest.yaml +0 -0
  437. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/mobile_a11y_native/recommended_kinds.yaml +0 -0
  438. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/mobile_a11y_native/severity_rules.yaml +0 -0
  439. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/mobile_android_material3/coverage_matrix.md +0 -0
  440. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/mobile_android_material3/elicit_extend.md +0 -0
  441. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/mobile_android_material3/lexicon.yaml +0 -0
  442. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/mobile_android_material3/manifest.yaml +0 -0
  443. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/mobile_android_material3/recommended_kinds.yaml +0 -0
  444. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/mobile_android_material3/severity_rules.yaml +0 -0
  445. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/mobile_ios_hig/coverage_matrix.md +0 -0
  446. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/mobile_ios_hig/elicit_extend.md +0 -0
  447. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/mobile_ios_hig/lexicon.yaml +0 -0
  448. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/mobile_ios_hig/manifest.yaml +0 -0
  449. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/mobile_ios_hig/recommended_kinds.yaml +0 -0
  450. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/mobile_ios_hig/severity_rules.yaml +0 -0
  451. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/mobile_security_masvs/coverage_matrix.md +0 -0
  452. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/mobile_security_masvs/elicit_extend.md +0 -0
  453. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/mobile_security_masvs/lexicon.yaml +0 -0
  454. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/mobile_security_masvs/manifest.yaml +0 -0
  455. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/mobile_security_masvs/recommended_kinds.yaml +0 -0
  456. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/mobile_security_masvs/severity_rules.yaml +0 -0
  457. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ops_cicd_pipeline/coverage_matrix.md +0 -0
  458. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ops_cicd_pipeline/elicit_extend.md +0 -0
  459. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ops_cicd_pipeline/lexicon.yaml +0 -0
  460. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ops_cicd_pipeline/manifest.yaml +0 -0
  461. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ops_cicd_pipeline/recommended_kinds.yaml +0 -0
  462. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ops_cicd_pipeline/severity_rules.yaml +0 -0
  463. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ops_iac_terraform/coverage_matrix.md +0 -0
  464. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ops_iac_terraform/elicit_extend.md +0 -0
  465. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ops_iac_terraform/lexicon.yaml +0 -0
  466. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ops_iac_terraform/manifest.yaml +0 -0
  467. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ops_iac_terraform/recommended_kinds.yaml +0 -0
  468. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ops_iac_terraform/severity_rules.yaml +0 -0
  469. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ops_kubernetes/coverage_matrix.md +0 -0
  470. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ops_kubernetes/elicit_extend.md +0 -0
  471. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ops_kubernetes/lexicon.yaml +0 -0
  472. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ops_kubernetes/manifest.yaml +0 -0
  473. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ops_kubernetes/recommended_kinds.yaml +0 -0
  474. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ops_kubernetes/severity_rules.yaml +0 -0
  475. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ops_observability_otel/coverage_matrix.md +0 -0
  476. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ops_observability_otel/elicit_extend.md +0 -0
  477. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ops_observability_otel/lexicon.yaml +0 -0
  478. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ops_observability_otel/manifest.yaml +0 -0
  479. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ops_observability_otel/recommended_kinds.yaml +0 -0
  480. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ops_observability_otel/severity_rules.yaml +0 -0
  481. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/process_iso25010/coverage_matrix.md +0 -0
  482. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/process_iso25010/elicit_extend.md +0 -0
  483. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/process_iso25010/lexicon.yaml +0 -0
  484. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/process_iso25010/manifest.yaml +0 -0
  485. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/process_iso25010/recommended_kinds.yaml +0 -0
  486. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/process_iso25010/severity_rules.yaml +0 -0
  487. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/process_test_iso29119/coverage_matrix.md +0 -0
  488. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/process_test_iso29119/elicit_extend.md +0 -0
  489. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/process_test_iso29119/lexicon.yaml +0 -0
  490. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/process_test_iso29119/manifest.yaml +0 -0
  491. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/process_test_iso29119/recommended_kinds.yaml +0 -0
  492. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/process_test_iso29119/severity_rules.yaml +0 -0
  493. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/twelve_factor_app/coverage_matrix.md +0 -0
  494. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/twelve_factor_app/elicit_extend.md +0 -0
  495. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/twelve_factor_app/lexicon.yaml +0 -0
  496. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/twelve_factor_app/manifest.yaml +0 -0
  497. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/twelve_factor_app/recommended_kinds.yaml +0 -0
  498. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/twelve_factor_app/severity_rules.yaml +0 -0
  499. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/coverage_matrix.md +0 -0
  500. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/elicit_extend.md +0 -0
  501. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/lexicon.yaml +0 -0
  502. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/manifest.yaml +0 -0
  503. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/recommended_kinds.yaml +0 -0
  504. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/severity_rules.yaml +0 -0
  505. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_authn_webauthn/coverage_matrix.md +0 -0
  506. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_authn_webauthn/elicit_extend.md +0 -0
  507. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_authn_webauthn/lexicon.yaml +0 -0
  508. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_authn_webauthn/manifest.yaml +0 -0
  509. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_authn_webauthn/recommended_kinds.yaml +0 -0
  510. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_authn_webauthn/severity_rules.yaml +0 -0
  511. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_browser_compat/coverage_matrix.md +0 -0
  512. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_browser_compat/elicit_extend.md +0 -0
  513. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_browser_compat/lexicon.yaml +0 -0
  514. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_browser_compat/manifest.yaml +0 -0
  515. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_browser_compat/recommended_kinds.yaml +0 -0
  516. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_browser_compat/severity_rules.yaml +0 -0
  517. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_forms_html5/coverage_matrix.md +0 -0
  518. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_forms_html5/elicit_extend.md +0 -0
  519. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_forms_html5/lexicon.yaml +0 -0
  520. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_forms_html5/manifest.yaml +0 -0
  521. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_forms_html5/recommended_kinds.yaml +0 -0
  522. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_forms_html5/severity_rules.yaml +0 -0
  523. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_performance_core_web_vitals/coverage_matrix.md +0 -0
  524. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_performance_core_web_vitals/elicit_extend.md +0 -0
  525. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_performance_core_web_vitals/lexicon.yaml +0 -0
  526. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_performance_core_web_vitals/manifest.yaml +0 -0
  527. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_performance_core_web_vitals/recommended_kinds.yaml +0 -0
  528. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_performance_core_web_vitals/severity_rules.yaml +0 -0
  529. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_pwa_manifest/coverage_matrix.md +0 -0
  530. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_pwa_manifest/elicit_extend.md +0 -0
  531. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_pwa_manifest/lexicon.yaml +0 -0
  532. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_pwa_manifest/manifest.yaml +0 -0
  533. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_pwa_manifest/recommended_kinds.yaml +0 -0
  534. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_pwa_manifest/severity_rules.yaml +0 -0
  535. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_responsive/coverage_matrix.md +0 -0
  536. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_responsive/elicit_extend.md +0 -0
  537. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_responsive/lexicon.yaml +0 -0
  538. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_responsive/manifest.yaml +0 -0
  539. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_responsive/recommended_kinds.yaml +0 -0
  540. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_responsive/severity_rules.yaml +0 -0
  541. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_security_owasp/coverage_matrix.md +0 -0
  542. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_security_owasp/elicit_extend.md +0 -0
  543. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_security_owasp/lexicon.yaml +0 -0
  544. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_security_owasp/manifest.yaml +0 -0
  545. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_security_owasp/recommended_kinds.yaml +0 -0
  546. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_security_owasp/severity_rules.yaml +0 -0
  547. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_seo_schemaorg/coverage_matrix.md +0 -0
  548. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_seo_schemaorg/elicit_extend.md +0 -0
  549. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_seo_schemaorg/lexicon.yaml +0 -0
  550. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_seo_schemaorg/manifest.yaml +0 -0
  551. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_seo_schemaorg/recommended_kinds.yaml +0 -0
  552. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_seo_schemaorg/severity_rules.yaml +0 -0
  553. {codd_dev-2.27.0 → codd_dev-2.28.0}/codd_plugins/stack_map.yaml +0 -0
  554. {codd_dev-2.27.0 → codd_dev-2.28.0}/docs/cookbook/cdp_browser/README.md +0 -0
  555. {codd_dev-2.27.0 → codd_dev-2.28.0}/docs/cookbook/presentation_aggregation/README.md +0 -0
  556. {codd_dev-2.27.0 → codd_dev-2.28.0}/docs/requirements/README.md +0 -0
  557. {codd_dev-2.27.0 → codd_dev-2.28.0}/dogfood/README.md +0 -0
  558. {codd_dev-2.27.0 → codd_dev-2.28.0}/dogfood/fixtures/flat_py_app/README.md +0 -0
  559. {codd_dev-2.27.0 → codd_dev-2.28.0}/examples/README.md +0 -0
  560. {codd_dev-2.27.0 → codd_dev-2.28.0}/skills/codd-assemble/SKILL.md +0 -0
  561. {codd_dev-2.27.0 → codd_dev-2.28.0}/skills/codd-evolve/SKILL.md +0 -0
  562. {codd_dev-2.27.0 → codd_dev-2.28.0}/skills/codd-generate/SKILL.md +0 -0
  563. {codd_dev-2.27.0 → codd_dev-2.28.0}/skills/codd-greenfield/SKILL.md +0 -0
  564. {codd_dev-2.27.0 → codd_dev-2.28.0}/skills/codd-impact/SKILL.md +0 -0
  565. {codd_dev-2.27.0 → codd_dev-2.28.0}/skills/codd-init/SKILL.md +0 -0
  566. {codd_dev-2.27.0 → codd_dev-2.28.0}/skills/codd-propagate/SKILL.md +0 -0
  567. {codd_dev-2.27.0 → codd_dev-2.28.0}/skills/codd-restore/SKILL.md +0 -0
  568. {codd_dev-2.27.0 → codd_dev-2.28.0}/skills/codd-scan/SKILL.md +0 -0
  569. {codd_dev-2.27.0 → codd_dev-2.28.0}/skills/codd-validate/SKILL.md +0 -0
  570. {codd_dev-2.27.0 → codd_dev-2.28.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.27.0
3
+ Version: 2.28.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.27.0"
3
+ __version__ = "2.28.0"
@@ -156,12 +156,28 @@ implement:
156
156
  # re-opens the false-green window the gate closes). Greenfield-only.
157
157
  implement_oracle: true
158
158
  # Total implement-oracle attempts: one initial check + bounded corrective
159
- # retries that re-run implementation with normalized oracle feedback. Default 3
160
- # (initial + 2); minimum 1. NEVER unbounded -- a genuinely uncurable
159
+ # retries that re-run implementation with normalized oracle feedback. Default 5,
160
+ # sized to the escalation LADDER so every rung can be reached: initial(1) +
161
+ # narrow(<=2) + expanded(1) + broad(1). The 2nd narrow attempt is only spent
162
+ # while the repair is making progress (the loop classifies shrink vs
163
+ # oscillation); oscillation escalates immediately, so the budget is not wasted
164
+ # thrashing one rung. Minimum 1. NEVER unbounded -- a genuinely uncurable
161
165
  # incoherence still fails honestly (nothing is silently accepted). Only CURABLE
162
166
  # incoherence is retried; an environment/toolchain failure (failed dependency
163
167
  # install) is not handed to the SUT to "fix" in source.
164
- oracle_max_attempts: 3
168
+ oracle_max_attempts: 5
169
+ # Orphan-artifact gate (off | warn | enforce). The implement-time oracle's
170
+ # invariant: every GENERATED source artifact must be owned by exactly one
171
+ # implement task (or a declared harness/profile contract). An orphan (a file no
172
+ # task owns) sits OUTSIDE the artifact-contract graph -- its repair scope and
173
+ # write-fence are undecidable, so a non-deterministic SUT can keep mutating it
174
+ # invisibly. 'warn' (default) observes + reports orphans after implement but
175
+ # never blocks (the check is heuristic; a large behaviour change rolls out as
176
+ # warn). 'enforce' makes an orphan a hard stage failure. 'off' disables it. A
177
+ # legitimate helper a task wrote under its OWN output directory is adopted (it
178
+ # is dir-owned), so the warn list should be small. Only active for stacks with
179
+ # a declared implement-time oracle + a derivable owner index.
180
+ orphan_artifact_gate: warn
165
181
  # Bounded wall-clock for ONE implement-oracle command run (seconds). tsc on a
166
182
  # fresh build is fast, but a cold first run can compile a large module graph.
167
183
  # Default 600.
@@ -94,6 +94,7 @@ __all__ = [
94
94
  "ImplementOracleResult",
95
95
  "OracleRerunCallback",
96
96
  "OracleScopeError",
97
+ "build_contract_feedback",
97
98
  "certify_oracle_scope",
98
99
  "normalize_oracle_output",
99
100
  "resolve_implement_oracle",
@@ -204,6 +205,11 @@ class ImplementOracleResult:
204
205
  #: evidence) because scope derivation needs the per-diagnostic counterpart
205
206
  #: keys, not the language-neutral category. See ``codd.implement_oracle_scope``.
206
207
  diagnostics: list[Any] = field(default_factory=list)
208
+ #: Orphan artifacts (generated source files no task owns) found by the global
209
+ #: orphan-artifact gate. Populated in WARN mode (observation; the gate does not
210
+ #: fail) and ENFORCE mode (the gate fails). Empty when the gate is off / no
211
+ #: scope index / no orphans. Project-relative paths, for the report + dashboard.
212
+ orphan_artifacts: list[str] = field(default_factory=list)
207
213
 
208
214
  def category_counts(self) -> dict[str, int]:
209
215
  counts: dict[str, int] = {}
@@ -236,8 +242,21 @@ class ImplementOracleResult:
236
242
  "Ensure: (a) every `import { X } from \"./mod.js\"` imports a name `X` "
237
243
  "that `mod` actually `export`s; (b) test/helper files agree on the names "
238
244
  "they share (e.g. do not import `repoRoot` when the helper exports "
239
- "`projectRoot`); (c) every imported module path resolves. Regenerate the "
240
- "affected files so the whole project typechecks."
245
+ "`projectRoot`); (c) every imported module path resolves."
246
+ )
247
+ # (iii) Contract discipline — the anti-oscillation rule. A non-deterministic
248
+ # SUT, told only "symbol X is missing", tends to INVENT a new symbol/file
249
+ # each rerun (a different wrong guess every time → the diagnostics oscillate
250
+ # instead of converging). Forbid invention explicitly: reconcile to what
251
+ # ALREADY exists; a genuinely shared symbol goes in an OWNED module, not a
252
+ # newly-conjured file. (GPT-5.5 Pro consult, 2026-06-15: feedback iii.)
253
+ lines.append(
254
+ "Do NOT invent new symbols, helpers, or files to satisfy an import: "
255
+ "reconcile the import to a symbol the target module ALREADY exports (or "
256
+ "delete the import/usage if it is spurious). If two files must share a "
257
+ "symbol, add it to one OWNED module and import it — never duplicate it or "
258
+ "create an unowned shared file. Make the SMALLEST change that restores "
259
+ "coherence; do not rewrite unrelated code."
241
260
  )
242
261
  return "\n".join(lines)
243
262
 
@@ -246,10 +265,20 @@ class ImplementOracleResult:
246
265
  _FEEDBACK_FINDING_CAP = 12
247
266
 
248
267
  #: Total implement-oracle attempts: one initial check + bounded corrective
249
- #: retries. Default 3 (initial + 2). Bounded on purpose a genuinely uncurable
250
- #: incoherence still fails honestly (nothing is silently accepted). Mirrors the
251
- #: implement syntax-gate's ``DEFAULT_SYNTAX_GATE_MAX_ATTEMPTS`` discipline.
252
- DEFAULT_ORACLE_MAX_ATTEMPTS = 3
268
+ #: retries, sized to the ESCALATION LADDER so every rung can actually be reached
269
+ #: before the budget is spent. Default 5 = initial(1) + narrow(≤2) + expanded(1)
270
+ #: + broad(1). A flat cap of 3 (the previous default) could not run all three
271
+ #: rungs once — it died on ``narrow`` (initial + 2 reruns), so an oscillating SUT
272
+ #: that needed ``expanded``/``broad`` never got there (2026-06-15 codex11 dogfood:
273
+ #: 20→4→6 oscillation forced the gate to give up at cap=3 while still narrow).
274
+ #: The second ``narrow`` attempt is only spent when progress is being made (see
275
+ #: the progress/oscillation escalation in ``run_implement_oracle_gate``);
276
+ #: oscillation escalates immediately, so the budget is not wasted thrashing one
277
+ #: rung. Bounded on purpose — a genuinely uncurable incoherence still fails
278
+ #: honestly (nothing is silently accepted). Override via
279
+ #: ``implement.oracle_max_attempts``. Mirrors the implement syntax-gate's
280
+ #: ``DEFAULT_SYNTAX_GATE_MAX_ATTEMPTS`` discipline.
281
+ DEFAULT_ORACLE_MAX_ATTEMPTS = 5
253
282
 
254
283
 
255
284
  def _oracle_max_attempts(config: Mapping[str, Any] | None) -> int:
@@ -277,6 +306,32 @@ def _oracle_opt_out(config: Mapping[str, Any] | None) -> bool:
277
306
  return False
278
307
 
279
308
 
309
+ #: Orphan-artifact gate modes. ``warn`` (default) observes + reports orphans but
310
+ #: never blocks; ``enforce`` makes an orphan a hard stage failure; ``off`` disables
311
+ #: the check. Conservative default because the check is heuristic (see
312
+ #: ``find_orphan_artifacts``) — a large behaviour change starts as warn.
313
+ _ORPHAN_GATE_MODES = ("off", "warn", "enforce")
314
+ DEFAULT_ORPHAN_ARTIFACT_GATE = "warn"
315
+
316
+
317
+ def _orphan_artifact_gate_mode(config: Mapping[str, Any] | None) -> str:
318
+ """``implement.orphan_artifact_gate`` → ``off`` | ``warn`` | ``enforce``.
319
+
320
+ Default ``warn`` (observe + report, never block). An unrecognized value falls
321
+ back to the default rather than erroring — the gate must never be the thing
322
+ that breaks a build over a config typo.
323
+ """
324
+ section = (config or {}).get("implement") if isinstance(config, Mapping) else None
325
+ if isinstance(section, Mapping) and "orphan_artifact_gate" in section:
326
+ raw = section["orphan_artifact_gate"]
327
+ if isinstance(raw, bool): # tolerate a bool: True→enforce, False→off
328
+ return "enforce" if raw else "off"
329
+ value = str(raw).strip().lower()
330
+ if value in _ORPHAN_GATE_MODES:
331
+ return value
332
+ return DEFAULT_ORPHAN_ARTIFACT_GATE
333
+
334
+
280
335
  def _oracle_timeout_seconds(config: Mapping[str, Any] | None) -> float:
281
336
  """Bounded wall-clock for the oracle command (``implement.oracle_timeout_seconds``)."""
282
337
  section = (config or {}).get("implement") if isinstance(config, Mapping) else None
@@ -300,6 +355,132 @@ DEFAULT_ORACLE_TIMEOUT_SECONDS = 600.0
300
355
  DEFAULT_ORACLE_INSTALL_TIMEOUT_SECONDS = 900.0
301
356
 
302
357
 
358
+ # ── contract-aware feedback (exporter surface + targeted-edit directives) ──
359
+ #
360
+ # The base ``ImplementOracleResult.feedback_message()`` is contract-aware in
361
+ # vocabulary (it names the broken edge + the no-invent rule) but cannot see the
362
+ # EXPORTER's current interface or the rerun's allowed paths — those need
363
+ # ``project_root`` + the derived scope, which only the gate holds. This builder
364
+ # folds three convergence levers onto the base message at call time:
365
+ #
366
+ # (1) EXPORTER SURFACE — for each broken edge, the target module's CURRENT
367
+ # public exports ("./cli exports {run}"). Turns "invent a name for the
368
+ # missing symbol" into "reconcile to one of THESE". The #1 anti-oscillation
369
+ # lever (GPT-5.5 Pro consult, 2026-06-15: feedback 3a).
370
+ # (2) TARGETED-EDIT — on a SCOPED (narrow/expanded) rerun, the explicit
371
+ # "edit only these files, minimal diff, do not create new files/symbols"
372
+ # directive + the allowed-paths fence list. This is what makes a scoped
373
+ # rerun a localized RECONCILE instead of a full re-sample (change 2). Broad
374
+ # reruns omit it (broad legitimately regenerates).
375
+ # (3) it is purely ADDITIVE — a stack with no surface extractor (unknown
376
+ # language) and no scope still gets the full base message, unchanged.
377
+ #
378
+ # Language-agnostic: the surface extraction lives behind
379
+ # ``implement_oracle_scope.extract_public_surface`` (per-language; TS today,
380
+ # graceful ``None`` otherwise). No TS-specific text appears here.
381
+
382
+ #: Cap on exporter-surface entries listed in feedback (bounded prompt).
383
+ _FEEDBACK_SURFACE_CAP = 12
384
+ #: Cap on individual export names shown per module (a barrel can export hundreds).
385
+ _FEEDBACK_SURFACE_NAMES_CAP = 40
386
+
387
+
388
+ def build_contract_feedback(
389
+ result: ImplementOracleResult,
390
+ *,
391
+ project_root: Path,
392
+ scope: Any = None,
393
+ ) -> str:
394
+ """The SUT-facing feedback for a rerun: base message + surface + edit directives.
395
+
396
+ Always includes ``result.feedback_message()`` (the contract + no-invent rule).
397
+ Appends the EXPORTER SURFACE block when an extractor can recover any broken
398
+ edge's target exports, and — when ``scope`` is a NON-broad (scoped) rerun — the
399
+ TARGETED-EDIT block (minimal-diff directive + the allowed-paths write-fence).
400
+ Best-effort: any enrichment failure degrades to the base message (never raises).
401
+ """
402
+ base = result.feedback_message()
403
+ blocks: list[str] = [base]
404
+
405
+ # (1) Exporter surface — the current public interface of each broken edge's
406
+ # target module, so the SUT reconciles to a REAL symbol instead of guessing.
407
+ surface_block = _exporter_surface_block(result, project_root)
408
+ if surface_block:
409
+ blocks.append(surface_block)
410
+
411
+ # (2) Targeted-edit directive — only for a SCOPED rerun (narrow/expanded). A
412
+ # broad rerun (scope None / is_broad) legitimately regenerates everything, so
413
+ # it gets no minimal-diff fence.
414
+ scoped = scope is not None and not bool(getattr(scope, "is_broad", lambda: True)())
415
+ if scoped:
416
+ edit_block = _targeted_edit_block(scope)
417
+ if edit_block:
418
+ blocks.append(edit_block)
419
+
420
+ return "\n\n".join(blocks)
421
+
422
+
423
+ def _exporter_surface_block(result: ImplementOracleResult, project_root: Path) -> str:
424
+ """The 'current public interface of the demanded module(s)' feedback block."""
425
+ if not result.diagnostics:
426
+ return ""
427
+ try:
428
+ from codd.implement_oracle_scope import exporter_surface_for_diagnostics
429
+
430
+ surfaces = exporter_surface_for_diagnostics(result.diagnostics, project_root)
431
+ except Exception: # noqa: BLE001 — surface enrichment is best-effort.
432
+ return ""
433
+ if not surfaces:
434
+ return ""
435
+ lines = [
436
+ "CURRENT PUBLIC INTERFACE of the demanded module(s) — reconcile your "
437
+ "imports to these EXACT exports (do not invent members not listed):",
438
+ ]
439
+ for path, names in list(surfaces.items())[:_FEEDBACK_SURFACE_CAP]:
440
+ if names:
441
+ shown = names[:_FEEDBACK_SURFACE_NAMES_CAP]
442
+ more = len(names) - len(shown)
443
+ suffix = f", … (+{more} more)" if more > 0 else ""
444
+ lines.append(f" - `{path}` exports: {{{', '.join(shown)}}}{suffix}")
445
+ else:
446
+ lines.append(
447
+ f" - `{path}` exports NOTHING — the module has no public exports, so "
448
+ f"importing any named symbol from it is wrong (add the export to it, "
449
+ f"or import from the correct module)."
450
+ )
451
+ extra = len(surfaces) - _FEEDBACK_SURFACE_CAP
452
+ if extra > 0:
453
+ lines.append(f" ... and {extra} more module(s).")
454
+ return "\n".join(lines)
455
+
456
+
457
+ def _targeted_edit_block(scope: Any) -> str:
458
+ """The minimal-diff + write-fence feedback block for a SCOPED rerun.
459
+
460
+ Tells the SUT to RECONCILE the named files with the smallest possible change
461
+ and forbids creating files outside the scope — the prompt-side half of the
462
+ write-fence (the pipeline enforces the fence by reverting out-of-scope writes).
463
+ """
464
+ allowed = tuple(getattr(scope, "allowed_paths", ()) or ())
465
+ rung = getattr(scope, "rung", "scoped")
466
+ lines = [
467
+ f"TARGETED EDIT ({rung} scope): this is a LOCALIZED repair, not a "
468
+ "regeneration. Make the SMALLEST edit that makes the typecheck pass — "
469
+ "reconcile the imports/exports between the files below. Do NOT regenerate "
470
+ "them from scratch, do NOT create new files, and do NOT add new public "
471
+ "symbols beyond what is needed to satisfy the existing imports.",
472
+ ]
473
+ if allowed:
474
+ shown = list(allowed)[:_FEEDBACK_SURFACE_CAP]
475
+ more = len(allowed) - len(shown)
476
+ suffix = f", … (+{more} more)" if more > 0 else ""
477
+ lines.append(
478
+ "You may ONLY create/modify these paths (anything else you write will "
479
+ f"be reverted): {', '.join(shown)}{suffix}."
480
+ )
481
+ return "\n".join(lines)
482
+
483
+
303
484
  # ── scope certification (anti-false-green: the oracle must SEE src + tests) ──
304
485
 
305
486
 
@@ -892,30 +1073,58 @@ def run_implement_oracle_gate(
892
1073
  attempt = 1
893
1074
  rung = _SCOPE_NARROW if scope_index is not None else _SCOPE_BROAD
894
1075
  last_signature: tuple[Any, ...] | None = None
1076
+ #: Bounded history of EARLIER signatures (before ``last_signature``) for cycle
1077
+ #: detection. Small window — the cap is small, so a long cycle would exhaust the
1078
+ #: budget before recurring; this catches the tight A↔B↔A loop.
1079
+ signature_history: list[tuple[Any, ...]] = []
1080
+ #: Rungs that have already spent their ONE soft-progress allowance. A rung gets
1081
+ #: at most one "fewer-but-some-new" pass before soft progress also escalates —
1082
+ #: this is the ``narrow 2nd attempt only while progressing`` budget.
1083
+ soft_progress_used: set[str] = set()
895
1084
  while not result.passed and result.executed and rerun is not None and attempt < max_attempts:
896
1085
  # Only retry CURABLE incoherence — an environment/toolchain failure is not
897
1086
  # something the SUT can fix in source, so do not burn retries on it.
898
1087
  if _only_environment(result):
899
1088
  break
900
1089
 
901
- # Loop-breaker: if the SAME diagnostic signature survived the previous
902
- # scoped rerun, the scope was too small escalate the ladder a rung
903
- # (narrow expanded broad). Past broad with no progress → stop and
904
- # fail honestly (the next loop guard / the final return handle it).
1090
+ # Loop-breaker (progress/oscillation, set-based NOT exact equality). The
1091
+ # previous design escalated only when the signature was IDENTICAL twice,
1092
+ # which mis-read oscillation (a SUT inventing different errors each rerun)
1093
+ # as progress and stayed pinned at one rung until the budget drained. Now
1094
+ # we classify the SET relation to the previous signature and escalate on
1095
+ # oscillation/stuck/cycle, keep the rung on a strict shrink, and allow a
1096
+ # "fewer-but-some-new" soft step AT MOST ONCE per rung. (See
1097
+ # ``classify_signature_progress``.)
905
1098
  signature = _diagnostic_signature(result)
906
- if last_signature is not None and signature == last_signature and scope_index is not None:
907
- escalated = _next_rung(rung)
908
- if escalated is None:
1099
+ if last_signature is not None and scope_index is not None:
1100
+ verdict = _classify_progress(signature, last_signature, signature_history)
1101
+ should_escalate, escalate_reason = _escalation_decision(
1102
+ verdict, rung=rung, soft_progress_used=soft_progress_used
1103
+ )
1104
+ if should_escalate:
1105
+ escalated = _next_rung(rung)
1106
+ if escalated is None:
1107
+ echo(
1108
+ f"[greenfield] implement-oracle: {escalate_reason} at broad rerun — "
1109
+ "stopping (honest failure)."
1110
+ )
1111
+ break
909
1112
  echo(
910
- "[greenfield] implement-oracle: signature unchanged after broad rerun — "
911
- "stopping (honest failure)."
1113
+ f"[greenfield] implement-oracle: {escalate_reason} after {rung} rerun — "
1114
+ f"escalating scope to {escalated}."
912
1115
  )
913
- break
914
- echo(
915
- f"[greenfield] implement-oracle: signature unchanged after {rung} rerun — "
916
- f"escalating scope to {escalated}."
917
- )
918
- rung = escalated
1116
+ rung = escalated
1117
+ else:
1118
+ echo(
1119
+ f"[greenfield] implement-oracle: {verdict} at {rung} rerun — "
1120
+ f"keeping scope (the repair is converging)."
1121
+ )
1122
+ # Record history AFTER the comparison: ``last_signature`` rolls into the
1123
+ # bounded window so a later run can detect a cycle back to it.
1124
+ if last_signature is not None:
1125
+ signature_history.append(last_signature)
1126
+ if len(signature_history) > _SIGNATURE_HISTORY_WINDOW:
1127
+ signature_history.pop(0)
919
1128
  last_signature = signature
920
1129
 
921
1130
  # Derive the scope for this rung (broad when no index, or when the
@@ -941,7 +1150,8 @@ def run_implement_oracle_gate(
941
1150
  f"(attempt {attempt}/{max_attempts - 1}, scope={scope_label}) — "
942
1151
  f"categories {result.category_counts()}"
943
1152
  )
944
- _invoke_rerun(rerun, result.feedback_message(), scope)
1153
+ feedback = build_contract_feedback(result, project_root=root, scope=scope)
1154
+ _invoke_rerun(rerun, feedback, scope)
945
1155
  attempt += 1
946
1156
  result = _run_oracle_command(root, profile, spec, config)
947
1157
 
@@ -952,6 +1162,92 @@ def run_implement_oracle_gate(
952
1162
  f"[greenfield] implement-oracle: FAILED after {attempt} attempt(s) — "
953
1163
  f"{result.detail}; categories {result.category_counts()}"
954
1164
  )
1165
+
1166
+ # Global orphan-artifact gate (invariant 1+2): after the typecheck loop, check
1167
+ # that every generated source artifact has an owning task. Default WARN
1168
+ # (observe + record on the result, never block); ENFORCE turns an orphan into a
1169
+ # failure. Only runs with a scope index (the owner map) and a real oracle.
1170
+ result = _apply_orphan_artifact_gate(
1171
+ result, project_root=root, scope_index=scope_index, manifest_paths=manifest_paths, config=config, echo=echo
1172
+ )
1173
+ return result
1174
+
1175
+
1176
+ def _apply_orphan_artifact_gate(
1177
+ result: ImplementOracleResult,
1178
+ *,
1179
+ project_root: Path,
1180
+ scope_index: Any,
1181
+ manifest_paths: Any,
1182
+ config: Mapping[str, Any] | None,
1183
+ echo: Callable[[str], None],
1184
+ ) -> ImplementOracleResult:
1185
+ """Run the global orphan-artifact gate; return the (possibly failed) result.
1186
+
1187
+ NO-OP unless a ``scope_index`` exists (no owner map ⇒ nothing to check) and the
1188
+ mode is not ``off``. WARN records the orphans on ``result.orphan_artifacts`` and
1189
+ logs them. ENFORCE additionally flips a passing result to a HARD failure (an
1190
+ orphan artifact is an out-of-contract file the SUT can mutate invisibly). The
1191
+ manifest/profile-owned files are treated as legitimately owned (the contract
1192
+ escape hatch). Best-effort: any failure to compute orphans is swallowed (the
1193
+ gate must never crash a build it was only observing).
1194
+ """
1195
+ if scope_index is None:
1196
+ return result
1197
+ mode = _orphan_artifact_gate_mode(config)
1198
+ if mode == "off":
1199
+ return result
1200
+ try:
1201
+ from codd.implement_oracle_scope import find_orphan_artifacts
1202
+
1203
+ orphans = find_orphan_artifacts(
1204
+ scope_index, project_root, extra_owned=tuple(manifest_paths or ())
1205
+ )
1206
+ except Exception as exc: # noqa: BLE001 — observation must not break the build.
1207
+ echo(f"[greenfield] implement-oracle: orphan-artifact gate skipped ({exc}).")
1208
+ return result
1209
+ if not orphans:
1210
+ return result
1211
+
1212
+ paths = [o.path for o in orphans]
1213
+ result.orphan_artifacts = paths
1214
+ listing = ", ".join(paths[:_FEEDBACK_FINDING_CAP]) + (
1215
+ f", … (+{len(paths) - _FEEDBACK_FINDING_CAP} more)" if len(paths) > _FEEDBACK_FINDING_CAP else ""
1216
+ )
1217
+ if mode == "enforce":
1218
+ echo(
1219
+ f"[greenfield] implement-oracle: orphan-artifact gate (enforce) FAILED — "
1220
+ f"{len(paths)} generated artifact(s) own no task: {listing}. Every "
1221
+ f"artifact must be owned by a task (or declared harness/profile contract)."
1222
+ )
1223
+ if result.passed:
1224
+ # Flip an otherwise-clean result to a hard failure, carrying an honest
1225
+ # environment_build finding so the caller's StageError explains why.
1226
+ return ImplementOracleResult(
1227
+ passed=False,
1228
+ executed=result.executed,
1229
+ command=result.command,
1230
+ findings=[
1231
+ ImplementOracleFinding(
1232
+ category=EVIDENCE_ENVIRONMENT_BUILD,
1233
+ code="orphan_artifact",
1234
+ message=(
1235
+ f"{len(paths)} generated artifact(s) own no task: {listing}"
1236
+ ),
1237
+ )
1238
+ ],
1239
+ detail=f"orphan-artifact gate (enforce): {len(paths)} unowned artifact(s)",
1240
+ raw_output=result.raw_output,
1241
+ diagnostics=result.diagnostics,
1242
+ orphan_artifacts=paths,
1243
+ )
1244
+ return result
1245
+ # WARN (default): observe + report, never block.
1246
+ echo(
1247
+ f"[greenfield] implement-oracle: orphan-artifact gate (warn) — "
1248
+ f"{len(paths)} generated artifact(s) own no task: {listing}. (Observation "
1249
+ f"only; set implement.orphan_artifact_gate: enforce to make this a hard gate.)"
1250
+ )
955
1251
  return result
956
1252
 
957
1253
 
@@ -979,6 +1275,72 @@ def _diagnostic_signature(result: ImplementOracleResult) -> tuple[Any, ...]:
979
1275
  return ()
980
1276
 
981
1277
 
1278
+ #: How many earlier signatures the cycle detector remembers. Small — the attempt
1279
+ #: budget is small, so only a TIGHT cycle (A↔B↔A) can recur within it; a longer
1280
+ #: cycle drains the budget first (and the oscillation test catches its steps).
1281
+ _SIGNATURE_HISTORY_WINDOW = 4
1282
+
1283
+
1284
+ def _classify_progress(
1285
+ signature: tuple[Any, ...],
1286
+ last_signature: tuple[Any, ...] | None,
1287
+ history: list[tuple[Any, ...]],
1288
+ ) -> str:
1289
+ """Classify progress between signatures (delegates to the scope module).
1290
+
1291
+ Best-effort: a classification failure degrades to ``stuck`` (escalate) — the
1292
+ safe default, never an infinite stay at one rung.
1293
+ """
1294
+ try:
1295
+ from codd.implement_oracle_scope import classify_signature_progress
1296
+
1297
+ return classify_signature_progress(signature, last_signature, history=history)
1298
+ except Exception: # noqa: BLE001 — a classify miss must escalate, not loop.
1299
+ from codd.implement_oracle_scope import PROGRESS_STUCK
1300
+
1301
+ return PROGRESS_STUCK
1302
+
1303
+
1304
+ def _escalation_decision(
1305
+ verdict: str,
1306
+ *,
1307
+ rung: str,
1308
+ soft_progress_used: set[str],
1309
+ ) -> tuple[bool, str]:
1310
+ """Map a progress verdict → ``(should_escalate, human_reason)``.
1311
+
1312
+ * strict progress → stay (the repair is shrinking the SAME incoherence).
1313
+ * soft progress → stay ONCE per rung (record the allowance), then escalate.
1314
+ * oscillation / stuck / cycle → escalate immediately.
1315
+
1316
+ The soft allowance is the ``narrow 2nd attempt only while making progress``
1317
+ budget the cap (default 5) is sized for: one extra narrow shot when the SUT is
1318
+ genuinely converging, but no thrashing.
1319
+ """
1320
+ from codd.implement_oracle_scope import (
1321
+ PROGRESS_CYCLE,
1322
+ PROGRESS_OSCILLATION,
1323
+ PROGRESS_SOFT,
1324
+ PROGRESS_STRICT,
1325
+ PROGRESS_STUCK,
1326
+ )
1327
+
1328
+ if verdict == PROGRESS_STRICT:
1329
+ return False, "strict progress"
1330
+ if verdict == PROGRESS_SOFT:
1331
+ if rung in soft_progress_used:
1332
+ return True, "soft progress already spent its one allowance"
1333
+ soft_progress_used.add(rung)
1334
+ return False, "soft progress (one allowance)"
1335
+ if verdict == PROGRESS_OSCILLATION:
1336
+ return True, "diagnostics oscillating (not a shrink)"
1337
+ if verdict == PROGRESS_CYCLE:
1338
+ return True, "diagnostic cycle detected"
1339
+ # PROGRESS_STUCK or any unknown verdict → escalate (safe default).
1340
+ del PROGRESS_STUCK # named for clarity; the fallthrough covers it
1341
+ return True, "signature unchanged"
1342
+
1343
+
982
1344
  def _derive_scope_for_rung(
983
1345
  *,
984
1346
  result: ImplementOracleResult,