codd-dev 2.35.0__tar.gz → 2.36.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 (574) hide show
  1. {codd_dev-2.35.0 → codd_dev-2.36.0}/PKG-INFO +1 -1
  2. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/__init__.py +1 -1
  3. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/implementer.py +48 -16
  4. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/llm/plan_deriver.py +105 -0
  5. codd_dev-2.36.0/codd/reference_resolution.py +463 -0
  6. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/scanner.py +151 -8
  7. {codd_dev-2.35.0 → codd_dev-2.36.0}/pyproject.toml +1 -1
  8. {codd_dev-2.35.0 → codd_dev-2.36.0}/.gitignore +0 -0
  9. {codd_dev-2.35.0 → codd_dev-2.36.0}/LICENSE +0 -0
  10. {codd_dev-2.35.0 → codd_dev-2.36.0}/README.md +0 -0
  11. {codd_dev-2.35.0 → codd_dev-2.36.0}/bench_fixture/README.md +0 -0
  12. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/__main__.py +0 -0
  13. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/_git_helper.py +0 -0
  14. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/action_outcome.py +0 -0
  15. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/ai_invoke.py +0 -0
  16. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/ai_patch.py +0 -0
  17. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/artifact_contract.py +0 -0
  18. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/artifact_ids.py +0 -0
  19. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/artifacts/catalog.yaml +0 -0
  20. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/ask_user_question_adapter.py +0 -0
  21. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/assembler.py +0 -0
  22. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/bridge.py +0 -0
  23. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/brownfield/__init__.py +0 -0
  24. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/brownfield/pipeline.py +0 -0
  25. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/capability_completeness.py +0 -0
  26. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/claude_cli.py +0 -0
  27. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/cli.py +0 -0
  28. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/clustering.py +0 -0
  29. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/coherence_adapters.py +0 -0
  30. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/coherence_engine.py +0 -0
  31. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/confidence.py +0 -0
  32. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/config.py +0 -0
  33. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/config_schema.py +0 -0
  34. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/contracts.py +0 -0
  35. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/coverage_auditor.py +0 -0
  36. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/coverage_execution_coherence.py +0 -0
  37. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/coverage_metrics.py +0 -0
  38. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/dag/__init__.py +0 -0
  39. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/dag/auto_repair.py +0 -0
  40. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/dag/builder.py +0 -0
  41. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/dag/checks/__init__.py +0 -0
  42. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/dag/checks/_one_to_many_detection.py +0 -0
  43. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/dag/checks/artifact_contract_check.py +0 -0
  44. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/dag/checks/ci_health.py +0 -0
  45. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/dag/checks/dependency_freshness.py +0 -0
  46. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/dag/checks/depends_on_consistency.py +0 -0
  47. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/dag/checks/deployment_completeness.py +0 -0
  48. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/dag/checks/edge_validity.py +0 -0
  49. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/dag/checks/environment_coverage.py +0 -0
  50. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/dag/checks/implementation_coverage.py +0 -0
  51. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/dag/checks/node_completeness.py +0 -0
  52. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/dag/checks/opt_out.py +0 -0
  53. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/dag/checks/task_completion.py +0 -0
  54. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/dag/checks/transitive_closure.py +0 -0
  55. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/dag/checks/ui_coherence.py +0 -0
  56. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/dag/checks/user_journey_coherence.py +0 -0
  57. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/dag/coverage_axes.py +0 -0
  58. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/dag/defaults/cli.yaml +0 -0
  59. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/dag/defaults/cpp_embedded.yaml +0 -0
  60. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/dag/defaults/csharp.yaml +0 -0
  61. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/dag/defaults/elixir.yaml +0 -0
  62. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/dag/defaults/generic.yaml +0 -0
  63. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/dag/defaults/iot.yaml +0 -0
  64. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/dag/defaults/java.yaml +0 -0
  65. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/dag/defaults/kotlin.yaml +0 -0
  66. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/dag/defaults/mobile.yaml +0 -0
  67. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/dag/defaults/ruby.yaml +0 -0
  68. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/dag/defaults/rust.yaml +0 -0
  69. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/dag/defaults/scala.yaml +0 -0
  70. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/dag/defaults/swift.yaml +0 -0
  71. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/dag/defaults/test_frameworks.yaml +0 -0
  72. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/dag/defaults/web.yaml +0 -0
  73. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/dag/extractor.py +0 -0
  74. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/dag/impact.py +0 -0
  75. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/dag/runner.py +0 -0
  76. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/defaults.py +0 -0
  77. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/defaults.yaml +0 -0
  78. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/dependency_lock_coherence.py +0 -0
  79. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/deploy_targets/__init__.py +0 -0
  80. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/deploy_targets/app_service.py +0 -0
  81. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/deploy_targets/base.py +0 -0
  82. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/deploy_targets/docker_compose.py +0 -0
  83. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/deployer.py +0 -0
  84. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/deployment/__init__.py +0 -0
  85. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/deployment/checks/__init__.py +0 -0
  86. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/deployment/defaults/deploy_targets.yaml +0 -0
  87. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/deployment/defaults/runtime_capability_inference.yaml +0 -0
  88. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/deployment/defaults/schema_providers.yaml +0 -0
  89. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/deployment/defaults/verification_templates.yaml +0 -0
  90. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/deployment/extractor.py +0 -0
  91. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/deployment/providers/__init__.py +0 -0
  92. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/deployment/providers/ai_command.py +0 -0
  93. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/deployment/providers/ai_command_factory.py +0 -0
  94. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/deployment/providers/codex_app_server.py +0 -0
  95. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/deployment/providers/llm_consideration.py +0 -0
  96. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/deployment/providers/schema/__init__.py +0 -0
  97. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/deployment/providers/schema/prisma.py +0 -0
  98. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/deployment/providers/target/__init__.py +0 -0
  99. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/deployment/providers/target/docker_compose.py +0 -0
  100. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/deployment/providers/verification/__init__.py +0 -0
  101. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/deployment/providers/verification/assertion_handlers.py +0 -0
  102. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/deployment/providers/verification/cdp_browser.py +0 -0
  103. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/deployment/providers/verification/cdp_engines.py +0 -0
  104. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/deployment/providers/verification/cdp_launchers.py +0 -0
  105. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/deployment/providers/verification/cdp_wire.py +0 -0
  106. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/deployment/providers/verification/curl.py +0 -0
  107. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/deployment/providers/verification/form_strategies.py +0 -0
  108. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/deployment/providers/verification/means_catalog.py +0 -0
  109. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/deployment/providers/verification/playwright.py +0 -0
  110. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/deployment/providers/verification/vitest.py +0 -0
  111. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/design_md.py +0 -0
  112. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/diff/__init__.py +0 -0
  113. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/diff/apply.py +0 -0
  114. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/diff/engine.py +0 -0
  115. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/diff/persistence.py +0 -0
  116. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/diff/templates/diff_prompt.md +0 -0
  117. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/discovery.py +0 -0
  118. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/drift.py +0 -0
  119. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/e2e_contract_coherence.py +0 -0
  120. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/e2e_extractor.py +0 -0
  121. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/e2e_generator.py +0 -0
  122. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/e2e_runner.py +0 -0
  123. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/elicit/__init__.py +0 -0
  124. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/elicit/apply.py +0 -0
  125. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/elicit/engine.py +0 -0
  126. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/elicit/finding.py +0 -0
  127. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/elicit/formatters/__init__.py +0 -0
  128. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/elicit/formatters/base.py +0 -0
  129. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/elicit/formatters/interactive.py +0 -0
  130. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/elicit/formatters/json_fmt.py +0 -0
  131. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/elicit/formatters/md.py +0 -0
  132. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/elicit/lexicon_loader.py +0 -0
  133. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/elicit/persistence.py +0 -0
  134. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/elicit/templates/elicit_prompt_L0.md +0 -0
  135. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/env_refs.py +0 -0
  136. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/extract_ai.py +0 -0
  137. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/extract_paths.py +0 -0
  138. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/extractor.py +0 -0
  139. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/fix/__init__.py +0 -0
  140. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/fix/candidate_selector.py +0 -0
  141. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/fix/design_updater.py +0 -0
  142. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/fix/impl_propagation.py +0 -0
  143. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/fix/interactive_prompt.py +0 -0
  144. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/fix/phenomenon_fixer.py +0 -0
  145. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/fix/phenomenon_parser.py +0 -0
  146. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/fix/risk_classifier.py +0 -0
  147. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/fix/templates/clarification_question.txt +0 -0
  148. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/fix/templates/design_update.txt +0 -0
  149. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/fix/templates/impl_update.txt +0 -0
  150. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/fix/templates/phenomenon_parse.txt +0 -0
  151. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/fix/templates/risk_assessment.txt +0 -0
  152. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/fix/templates_loader.py +0 -0
  153. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/fixer.py +0 -0
  154. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/fixup_drift.py +0 -0
  155. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/fixup_drift_strategies/__init__.py +0 -0
  156. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/fixup_drift_strategies/design_token_drift.py +0 -0
  157. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/fixup_drift_strategies/lexicon_violation.py +0 -0
  158. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/fixup_drift_strategies/url_drift.py +0 -0
  159. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/frontmatter.py +0 -0
  160. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/generator.py +0 -0
  161. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/git_evidence.py +0 -0
  162. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/graph.py +0 -0
  163. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/greenfield/__init__.py +0 -0
  164. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/greenfield/pipeline.py +0 -0
  165. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/hitl_session.py +0 -0
  166. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/hooks/__init__.py +0 -0
  167. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/hooks/pre-commit +0 -0
  168. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/hooks/recipes/claude_requirements_nudge.json +0 -0
  169. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/hooks/recipes/claude_settings_example.json +0 -0
  170. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/hooks/recipes/codex_hook.sh +0 -0
  171. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/hooks/recipes/git_post_commit.sh +0 -0
  172. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/hooks/recipes/git_pre_commit.sh +0 -0
  173. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/iac_nfr.py +0 -0
  174. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/implement_oracle.py +0 -0
  175. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/implement_oracle_scope.py +0 -0
  176. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/implementer/__init__.py +0 -0
  177. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/implementer/chunked_runner.py +0 -0
  178. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/implementer/typecheck_loop.py +0 -0
  179. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/import_coherence.py +0 -0
  180. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/inheritance.py +0 -0
  181. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/init/__init__.py +0 -0
  182. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/init/lexicon_suggest.py +0 -0
  183. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/init/llm_lexicon_suggester.py +0 -0
  184. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/init/stack_detector.py +0 -0
  185. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/knowledge_fetcher.py +0 -0
  186. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/lexicon.py +0 -0
  187. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/lexicon_cli/__init__.py +0 -0
  188. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/lexicon_cli/formatters/__init__.py +0 -0
  189. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/lexicon_cli/formatters/html.py +0 -0
  190. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/lexicon_cli/formatters/json_fmt.py +0 -0
  191. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/lexicon_cli/formatters/md.py +0 -0
  192. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/lexicon_cli/inspector.py +0 -0
  193. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/lexicon_cli/manager.py +0 -0
  194. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/lexicon_cli/reporter.py +0 -0
  195. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/lexicon_cli/threshold.py +0 -0
  196. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/llm/__init__.py +0 -0
  197. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/llm/approval.py +0 -0
  198. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/llm/best_practice_augmenter.py +0 -0
  199. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/llm/criteria_expander.py +0 -0
  200. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/llm/design_doc_extractor.py +0 -0
  201. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/llm/impl_step_deriver.py +0 -0
  202. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/llm/means_catalog_loader.py +0 -0
  203. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/llm/parser.py +0 -0
  204. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/llm/prompt_builder.py +0 -0
  205. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/llm/strategy_validator.py +0 -0
  206. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/llm/templates/best_practice_augment_meta.md +0 -0
  207. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/llm/templates/criteria_expand_meta.md +0 -0
  208. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/llm/templates/design_doc_extract_meta.md +0 -0
  209. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/llm/templates/impl_step_derive_meta.md +0 -0
  210. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/llm/templates/implementation_step_catalog.yaml +0 -0
  211. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/llm/templates/meta_instruction.md +0 -0
  212. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/llm/templates/plan_derive_meta.md +0 -0
  213. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/llm/templates/verification_means_catalog.yaml +0 -0
  214. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/mcp_server.py +0 -0
  215. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/measure.py +0 -0
  216. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/operational_e2e_audit.py +0 -0
  217. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/operations_derive.py +0 -0
  218. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/parsing/__init__.py +0 -0
  219. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/parsing/_shared.py +0 -0
  220. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/parsing/api_specs.py +0 -0
  221. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/parsing/filesystem_routes.py +0 -0
  222. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/parsing/iac.py +0 -0
  223. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/parsing/python_ast.py +0 -0
  224. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/parsing/schemas.py +0 -0
  225. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/parsing/tests_builddeps.py +0 -0
  226. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/parsing/treesitter.py +0 -0
  227. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/planner.py +0 -0
  228. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/policy.py +0 -0
  229. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/preflight/__init__.py +0 -0
  230. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/preflight/defaults/cli.yaml +0 -0
  231. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/preflight/defaults/generic.yaml +0 -0
  232. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/preflight/defaults/iot.yaml +0 -0
  233. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/preflight/defaults/mobile.yaml +0 -0
  234. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/preflight/defaults/web.yaml +0 -0
  235. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/project_types.py +0 -0
  236. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/propagate.py +0 -0
  237. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/propagation_common.py +0 -0
  238. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/propagator.py +0 -0
  239. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/reconciliation_ledger.py +0 -0
  240. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/registry.py +0 -0
  241. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/repair/__init__.py +0 -0
  242. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/repair/approval_repair.py +0 -0
  243. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/repair/auto_scope_guard.py +0 -0
  244. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/repair/engine.py +0 -0
  245. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/repair/git_patcher.py +0 -0
  246. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/repair/history.py +0 -0
  247. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/repair/llm_repair_engine.py +0 -0
  248. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/repair/loop.py +0 -0
  249. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/repair/primary_picker.py +0 -0
  250. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/repair/proof_breaks.py +0 -0
  251. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/repair/repair_result.py +0 -0
  252. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/repair/repairability_classifier.py +0 -0
  253. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/repair/schema.py +0 -0
  254. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/repair/templates/analyze_meta.md +0 -0
  255. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/repair/templates/propose_meta.md +0 -0
  256. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/repair/templates/repair_strategy_meta.md +0 -0
  257. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/repair/templates/repairability_meta.md +0 -0
  258. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/repair/test_failure_attribution.py +0 -0
  259. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/repair/verify_runner.py +0 -0
  260. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/repair_slice.py +0 -0
  261. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/require.py +0 -0
  262. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/require_plugins.py +0 -0
  263. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/require_propagate.py +0 -0
  264. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/required_artifacts/defaults/cli.yaml +0 -0
  265. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/required_artifacts/defaults/generic.yaml +0 -0
  266. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/required_artifacts/defaults/iot.yaml +0 -0
  267. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/required_artifacts/defaults/mobile.yaml +0 -0
  268. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/required_artifacts/defaults/web.yaml +0 -0
  269. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/required_artifacts_deriver.py +0 -0
  270. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/requirement_completeness/defaults/cli.yaml +0 -0
  271. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/requirement_completeness/defaults/generic.yaml +0 -0
  272. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/requirement_completeness/defaults/iot.yaml +0 -0
  273. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/requirement_completeness/defaults/mobile.yaml +0 -0
  274. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/requirement_completeness/defaults/web.yaml +0 -0
  275. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/requirement_completeness_auditor.py +0 -0
  276. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/requirement_reconciliation.py +0 -0
  277. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/requirements_meta.py +0 -0
  278. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/restoration_report.py +0 -0
  279. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/restore.py +0 -0
  280. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/routes_extractor.py +0 -0
  281. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/runtime_smoke/__init__.py +0 -0
  282. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/runtime_smoke/checks.py +0 -0
  283. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/runtime_smoke/config.py +0 -0
  284. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/runtime_smoke/report.py +0 -0
  285. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/runtime_smoke/runner.py +0 -0
  286. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/schema_refs.py +0 -0
  287. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/screen_flow_validator.py +0 -0
  288. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/screen_transition_extractor.py +0 -0
  289. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/screen_transitions/defaults.yaml +0 -0
  290. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/skills_cli/__init__.py +0 -0
  291. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/skills_cli/discovery.py +0 -0
  292. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/skills_cli/manager.py +0 -0
  293. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/skills_cli/paths.py +0 -0
  294. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/surface_reconciliation.py +0 -0
  295. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/synth.py +0 -0
  296. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/templates/codd.yaml.tmpl +0 -0
  297. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/templates/conventions.yaml.tmpl +0 -0
  298. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/templates/data_dependencies.yaml.tmpl +0 -0
  299. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/templates/doc_links.yaml.tmpl +0 -0
  300. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/templates/extract_ai_prompt_baseline.md +0 -0
  301. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/templates/extracted/api-contract.md.j2 +0 -0
  302. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/templates/extracted/architecture-overview.md.j2 +0 -0
  303. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/templates/extracted/module-detail.md.j2 +0 -0
  304. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/templates/extracted/schema-design.md.j2 +0 -0
  305. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/templates/extracted/system-context.md.j2 +0 -0
  306. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/templates/gitignore.tmpl +0 -0
  307. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/templates/lexicon_questions.md +0 -0
  308. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/templates/lexicon_schema.yaml +0 -0
  309. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/templates/overrides.yaml.tmpl +0 -0
  310. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/test_detection.py +0 -0
  311. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/test_import_coherence.py +0 -0
  312. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/traceability.py +0 -0
  313. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/validator.py +0 -0
  314. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/vb_marker_authenticity.py +0 -0
  315. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/vb_rerun_scope.py +0 -0
  316. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/verifiable_behavior_audit.py +0 -0
  317. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/watch/__init__.py +0 -0
  318. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/watch/events.py +0 -0
  319. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/watch/propagation_log.py +0 -0
  320. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/watch/propagation_pipeline.py +0 -0
  321. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/watch/test_runner.py +0 -0
  322. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/watch/watcher.py +0 -0
  323. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/wiring.py +0 -0
  324. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ai_governance_eu_act/coverage_matrix.md +0 -0
  325. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ai_governance_eu_act/elicit_extend.md +0 -0
  326. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ai_governance_eu_act/lexicon.yaml +0 -0
  327. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ai_governance_eu_act/manifest.yaml +0 -0
  328. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ai_governance_eu_act/recommended_kinds.yaml +0 -0
  329. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ai_governance_eu_act/severity_rules.yaml +0 -0
  330. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/api_rate_limiting_caching/coverage_matrix.md +0 -0
  331. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/api_rate_limiting_caching/elicit_extend.md +0 -0
  332. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/api_rate_limiting_caching/lexicon.yaml +0 -0
  333. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/api_rate_limiting_caching/manifest.yaml +0 -0
  334. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/api_rate_limiting_caching/recommended_kinds.yaml +0 -0
  335. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/api_rate_limiting_caching/severity_rules.yaml +0 -0
  336. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/api_rest_openapi/coverage_matrix.md +0 -0
  337. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/api_rest_openapi/elicit_extend.md +0 -0
  338. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/api_rest_openapi/lexicon.yaml +0 -0
  339. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/api_rest_openapi/manifest.yaml +0 -0
  340. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/api_rest_openapi/recommended_kinds.yaml +0 -0
  341. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/api_rest_openapi/severity_rules.yaml +0 -0
  342. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/babok/elicit_extend.md +0 -0
  343. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/babok/lexicon.yaml +0 -0
  344. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/babok/manifest.yaml +0 -0
  345. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/babok/recommended_kinds.yaml +0 -0
  346. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/babok/severity_rules.yaml +0 -0
  347. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/backend_event_cloudevents/coverage_matrix.md +0 -0
  348. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/backend_event_cloudevents/elicit_extend.md +0 -0
  349. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/backend_event_cloudevents/lexicon.yaml +0 -0
  350. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/backend_event_cloudevents/manifest.yaml +0 -0
  351. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/backend_event_cloudevents/recommended_kinds.yaml +0 -0
  352. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/backend_event_cloudevents/severity_rules.yaml +0 -0
  353. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/backend_graphql/coverage_matrix.md +0 -0
  354. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/backend_graphql/elicit_extend.md +0 -0
  355. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/backend_graphql/lexicon.yaml +0 -0
  356. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/backend_graphql/manifest.yaml +0 -0
  357. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/backend_graphql/recommended_kinds.yaml +0 -0
  358. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/backend_graphql/severity_rules.yaml +0 -0
  359. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/backend_grpc_proto/coverage_matrix.md +0 -0
  360. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/backend_grpc_proto/elicit_extend.md +0 -0
  361. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/backend_grpc_proto/lexicon.yaml +0 -0
  362. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/backend_grpc_proto/manifest.yaml +0 -0
  363. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/backend_grpc_proto/recommended_kinds.yaml +0 -0
  364. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/backend_grpc_proto/severity_rules.yaml +0 -0
  365. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/compliance_hipaa/coverage_matrix.md +0 -0
  366. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/compliance_hipaa/elicit_extend.md +0 -0
  367. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/compliance_hipaa/lexicon.yaml +0 -0
  368. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/compliance_hipaa/manifest.yaml +0 -0
  369. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/compliance_hipaa/recommended_kinds.yaml +0 -0
  370. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/compliance_hipaa/severity_rules.yaml +0 -0
  371. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/compliance_iso27001/coverage_matrix.md +0 -0
  372. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/compliance_iso27001/elicit_extend.md +0 -0
  373. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/compliance_iso27001/lexicon.yaml +0 -0
  374. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/compliance_iso27001/manifest.yaml +0 -0
  375. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/compliance_iso27001/recommended_kinds.yaml +0 -0
  376. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/compliance_iso27001/severity_rules.yaml +0 -0
  377. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/compliance_pci_dss_4/coverage_matrix.md +0 -0
  378. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/compliance_pci_dss_4/elicit_extend.md +0 -0
  379. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/compliance_pci_dss_4/lexicon.yaml +0 -0
  380. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/compliance_pci_dss_4/manifest.yaml +0 -0
  381. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/compliance_pci_dss_4/recommended_kinds.yaml +0 -0
  382. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/compliance_pci_dss_4/severity_rules.yaml +0 -0
  383. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/data_aggregation_policies/coverage_matrix.md +0 -0
  384. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/data_aggregation_policies/elicit_extend.md +0 -0
  385. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/data_aggregation_policies/lexicon.yaml +0 -0
  386. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/data_aggregation_policies/manifest.yaml +0 -0
  387. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/data_aggregation_policies/recommended_kinds.yaml +0 -0
  388. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/data_aggregation_policies/severity_rules.yaml +0 -0
  389. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/coverage_matrix.md +0 -0
  390. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/elicit_extend.md +0 -0
  391. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/lexicon.yaml +0 -0
  392. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/manifest.yaml +0 -0
  393. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/recommended_kinds.yaml +0 -0
  394. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/severity_rules.yaml +0 -0
  395. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/data_governance_appi_gdpr/coverage_matrix.md +0 -0
  396. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/data_governance_appi_gdpr/elicit_extend.md +0 -0
  397. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/data_governance_appi_gdpr/lexicon.yaml +0 -0
  398. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/data_governance_appi_gdpr/manifest.yaml +0 -0
  399. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/data_governance_appi_gdpr/recommended_kinds.yaml +0 -0
  400. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/data_governance_appi_gdpr/severity_rules.yaml +0 -0
  401. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/data_nosql_jsonschema/coverage_matrix.md +0 -0
  402. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/data_nosql_jsonschema/elicit_extend.md +0 -0
  403. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/data_nosql_jsonschema/lexicon.yaml +0 -0
  404. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/data_nosql_jsonschema/manifest.yaml +0 -0
  405. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/data_nosql_jsonschema/recommended_kinds.yaml +0 -0
  406. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/data_nosql_jsonschema/severity_rules.yaml +0 -0
  407. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/data_relational_iso_sql/coverage_matrix.md +0 -0
  408. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/data_relational_iso_sql/elicit_extend.md +0 -0
  409. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/data_relational_iso_sql/lexicon.yaml +0 -0
  410. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/data_relational_iso_sql/manifest.yaml +0 -0
  411. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/data_relational_iso_sql/recommended_kinds.yaml +0 -0
  412. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/data_relational_iso_sql/severity_rules.yaml +0 -0
  413. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ddd_domain_driven_design/coverage_matrix.md +0 -0
  414. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ddd_domain_driven_design/elicit_extend.md +0 -0
  415. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ddd_domain_driven_design/lexicon.yaml +0 -0
  416. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ddd_domain_driven_design/manifest.yaml +0 -0
  417. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ddd_domain_driven_design/recommended_kinds.yaml +0 -0
  418. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ddd_domain_driven_design/severity_rules.yaml +0 -0
  419. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/dora_sre_metrics/coverage_matrix.md +0 -0
  420. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/dora_sre_metrics/elicit_extend.md +0 -0
  421. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/dora_sre_metrics/lexicon.yaml +0 -0
  422. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/dora_sre_metrics/manifest.yaml +0 -0
  423. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/dora_sre_metrics/recommended_kinds.yaml +0 -0
  424. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/dora_sre_metrics/severity_rules.yaml +0 -0
  425. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/i18n_unicode_cldr/coverage_matrix.md +0 -0
  426. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/i18n_unicode_cldr/elicit_extend.md +0 -0
  427. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/i18n_unicode_cldr/lexicon.yaml +0 -0
  428. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/i18n_unicode_cldr/manifest.yaml +0 -0
  429. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/i18n_unicode_cldr/recommended_kinds.yaml +0 -0
  430. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/i18n_unicode_cldr/severity_rules.yaml +0 -0
  431. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ml_model_cards/coverage_matrix.md +0 -0
  432. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ml_model_cards/elicit_extend.md +0 -0
  433. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ml_model_cards/lexicon.yaml +0 -0
  434. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ml_model_cards/manifest.yaml +0 -0
  435. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ml_model_cards/recommended_kinds.yaml +0 -0
  436. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ml_model_cards/severity_rules.yaml +0 -0
  437. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/mobile_a11y_native/coverage_matrix.md +0 -0
  438. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/mobile_a11y_native/elicit_extend.md +0 -0
  439. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/mobile_a11y_native/lexicon.yaml +0 -0
  440. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/mobile_a11y_native/manifest.yaml +0 -0
  441. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/mobile_a11y_native/recommended_kinds.yaml +0 -0
  442. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/mobile_a11y_native/severity_rules.yaml +0 -0
  443. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/mobile_android_material3/coverage_matrix.md +0 -0
  444. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/mobile_android_material3/elicit_extend.md +0 -0
  445. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/mobile_android_material3/lexicon.yaml +0 -0
  446. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/mobile_android_material3/manifest.yaml +0 -0
  447. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/mobile_android_material3/recommended_kinds.yaml +0 -0
  448. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/mobile_android_material3/severity_rules.yaml +0 -0
  449. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/mobile_ios_hig/coverage_matrix.md +0 -0
  450. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/mobile_ios_hig/elicit_extend.md +0 -0
  451. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/mobile_ios_hig/lexicon.yaml +0 -0
  452. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/mobile_ios_hig/manifest.yaml +0 -0
  453. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/mobile_ios_hig/recommended_kinds.yaml +0 -0
  454. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/mobile_ios_hig/severity_rules.yaml +0 -0
  455. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/mobile_security_masvs/coverage_matrix.md +0 -0
  456. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/mobile_security_masvs/elicit_extend.md +0 -0
  457. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/mobile_security_masvs/lexicon.yaml +0 -0
  458. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/mobile_security_masvs/manifest.yaml +0 -0
  459. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/mobile_security_masvs/recommended_kinds.yaml +0 -0
  460. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/mobile_security_masvs/severity_rules.yaml +0 -0
  461. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ops_cicd_pipeline/coverage_matrix.md +0 -0
  462. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ops_cicd_pipeline/elicit_extend.md +0 -0
  463. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ops_cicd_pipeline/lexicon.yaml +0 -0
  464. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ops_cicd_pipeline/manifest.yaml +0 -0
  465. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ops_cicd_pipeline/recommended_kinds.yaml +0 -0
  466. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ops_cicd_pipeline/severity_rules.yaml +0 -0
  467. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ops_iac_terraform/coverage_matrix.md +0 -0
  468. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ops_iac_terraform/elicit_extend.md +0 -0
  469. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ops_iac_terraform/lexicon.yaml +0 -0
  470. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ops_iac_terraform/manifest.yaml +0 -0
  471. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ops_iac_terraform/recommended_kinds.yaml +0 -0
  472. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ops_iac_terraform/severity_rules.yaml +0 -0
  473. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ops_kubernetes/coverage_matrix.md +0 -0
  474. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ops_kubernetes/elicit_extend.md +0 -0
  475. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ops_kubernetes/lexicon.yaml +0 -0
  476. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ops_kubernetes/manifest.yaml +0 -0
  477. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ops_kubernetes/recommended_kinds.yaml +0 -0
  478. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ops_kubernetes/severity_rules.yaml +0 -0
  479. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ops_observability_otel/coverage_matrix.md +0 -0
  480. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ops_observability_otel/elicit_extend.md +0 -0
  481. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ops_observability_otel/lexicon.yaml +0 -0
  482. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ops_observability_otel/manifest.yaml +0 -0
  483. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ops_observability_otel/recommended_kinds.yaml +0 -0
  484. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ops_observability_otel/severity_rules.yaml +0 -0
  485. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/process_iso25010/coverage_matrix.md +0 -0
  486. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/process_iso25010/elicit_extend.md +0 -0
  487. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/process_iso25010/lexicon.yaml +0 -0
  488. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/process_iso25010/manifest.yaml +0 -0
  489. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/process_iso25010/recommended_kinds.yaml +0 -0
  490. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/process_iso25010/severity_rules.yaml +0 -0
  491. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/process_test_iso29119/coverage_matrix.md +0 -0
  492. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/process_test_iso29119/elicit_extend.md +0 -0
  493. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/process_test_iso29119/lexicon.yaml +0 -0
  494. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/process_test_iso29119/manifest.yaml +0 -0
  495. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/process_test_iso29119/recommended_kinds.yaml +0 -0
  496. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/process_test_iso29119/severity_rules.yaml +0 -0
  497. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/twelve_factor_app/coverage_matrix.md +0 -0
  498. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/twelve_factor_app/elicit_extend.md +0 -0
  499. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/twelve_factor_app/lexicon.yaml +0 -0
  500. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/twelve_factor_app/manifest.yaml +0 -0
  501. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/twelve_factor_app/recommended_kinds.yaml +0 -0
  502. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/twelve_factor_app/severity_rules.yaml +0 -0
  503. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/coverage_matrix.md +0 -0
  504. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/elicit_extend.md +0 -0
  505. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/lexicon.yaml +0 -0
  506. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/manifest.yaml +0 -0
  507. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/recommended_kinds.yaml +0 -0
  508. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/severity_rules.yaml +0 -0
  509. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_authn_webauthn/coverage_matrix.md +0 -0
  510. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_authn_webauthn/elicit_extend.md +0 -0
  511. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_authn_webauthn/lexicon.yaml +0 -0
  512. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_authn_webauthn/manifest.yaml +0 -0
  513. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_authn_webauthn/recommended_kinds.yaml +0 -0
  514. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_authn_webauthn/severity_rules.yaml +0 -0
  515. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_browser_compat/coverage_matrix.md +0 -0
  516. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_browser_compat/elicit_extend.md +0 -0
  517. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_browser_compat/lexicon.yaml +0 -0
  518. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_browser_compat/manifest.yaml +0 -0
  519. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_browser_compat/recommended_kinds.yaml +0 -0
  520. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_browser_compat/severity_rules.yaml +0 -0
  521. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_forms_html5/coverage_matrix.md +0 -0
  522. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_forms_html5/elicit_extend.md +0 -0
  523. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_forms_html5/lexicon.yaml +0 -0
  524. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_forms_html5/manifest.yaml +0 -0
  525. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_forms_html5/recommended_kinds.yaml +0 -0
  526. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_forms_html5/severity_rules.yaml +0 -0
  527. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_performance_core_web_vitals/coverage_matrix.md +0 -0
  528. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_performance_core_web_vitals/elicit_extend.md +0 -0
  529. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_performance_core_web_vitals/lexicon.yaml +0 -0
  530. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_performance_core_web_vitals/manifest.yaml +0 -0
  531. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_performance_core_web_vitals/recommended_kinds.yaml +0 -0
  532. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_performance_core_web_vitals/severity_rules.yaml +0 -0
  533. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_pwa_manifest/coverage_matrix.md +0 -0
  534. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_pwa_manifest/elicit_extend.md +0 -0
  535. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_pwa_manifest/lexicon.yaml +0 -0
  536. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_pwa_manifest/manifest.yaml +0 -0
  537. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_pwa_manifest/recommended_kinds.yaml +0 -0
  538. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_pwa_manifest/severity_rules.yaml +0 -0
  539. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_responsive/coverage_matrix.md +0 -0
  540. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_responsive/elicit_extend.md +0 -0
  541. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_responsive/lexicon.yaml +0 -0
  542. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_responsive/manifest.yaml +0 -0
  543. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_responsive/recommended_kinds.yaml +0 -0
  544. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_responsive/severity_rules.yaml +0 -0
  545. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_security_owasp/coverage_matrix.md +0 -0
  546. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_security_owasp/elicit_extend.md +0 -0
  547. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_security_owasp/lexicon.yaml +0 -0
  548. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_security_owasp/manifest.yaml +0 -0
  549. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_security_owasp/recommended_kinds.yaml +0 -0
  550. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_security_owasp/severity_rules.yaml +0 -0
  551. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_seo_schemaorg/coverage_matrix.md +0 -0
  552. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_seo_schemaorg/elicit_extend.md +0 -0
  553. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_seo_schemaorg/lexicon.yaml +0 -0
  554. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_seo_schemaorg/manifest.yaml +0 -0
  555. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_seo_schemaorg/recommended_kinds.yaml +0 -0
  556. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_seo_schemaorg/severity_rules.yaml +0 -0
  557. {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/stack_map.yaml +0 -0
  558. {codd_dev-2.35.0 → codd_dev-2.36.0}/docs/cookbook/cdp_browser/README.md +0 -0
  559. {codd_dev-2.35.0 → codd_dev-2.36.0}/docs/cookbook/presentation_aggregation/README.md +0 -0
  560. {codd_dev-2.35.0 → codd_dev-2.36.0}/docs/requirements/README.md +0 -0
  561. {codd_dev-2.35.0 → codd_dev-2.36.0}/dogfood/README.md +0 -0
  562. {codd_dev-2.35.0 → codd_dev-2.36.0}/dogfood/fixtures/flat_py_app/README.md +0 -0
  563. {codd_dev-2.35.0 → codd_dev-2.36.0}/examples/README.md +0 -0
  564. {codd_dev-2.35.0 → codd_dev-2.36.0}/skills/codd-assemble/SKILL.md +0 -0
  565. {codd_dev-2.35.0 → codd_dev-2.36.0}/skills/codd-evolve/SKILL.md +0 -0
  566. {codd_dev-2.35.0 → codd_dev-2.36.0}/skills/codd-generate/SKILL.md +0 -0
  567. {codd_dev-2.35.0 → codd_dev-2.36.0}/skills/codd-greenfield/SKILL.md +0 -0
  568. {codd_dev-2.35.0 → codd_dev-2.36.0}/skills/codd-impact/SKILL.md +0 -0
  569. {codd_dev-2.35.0 → codd_dev-2.36.0}/skills/codd-init/SKILL.md +0 -0
  570. {codd_dev-2.35.0 → codd_dev-2.36.0}/skills/codd-propagate/SKILL.md +0 -0
  571. {codd_dev-2.35.0 → codd_dev-2.36.0}/skills/codd-restore/SKILL.md +0 -0
  572. {codd_dev-2.35.0 → codd_dev-2.36.0}/skills/codd-scan/SKILL.md +0 -0
  573. {codd_dev-2.35.0 → codd_dev-2.36.0}/skills/codd-validate/SKILL.md +0 -0
  574. {codd_dev-2.35.0 → codd_dev-2.36.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.35.0
3
+ Version: 2.36.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.35.0"
3
+ __version__ = "2.36.0"
@@ -804,6 +804,7 @@ class Implementer:
804
804
  self.project_root,
805
805
  _ordered_unique([*explicit_dependencies, *design_dependencies]),
806
806
  node_paths,
807
+ self.config,
807
808
  )
808
809
  design_document = DependencyDocument(
809
810
  node_id=design_context.node_id,
@@ -1276,23 +1277,53 @@ def _load_design_context(project_root: Path, config: dict[str, Any], design_node
1276
1277
 
1277
1278
 
1278
1279
  def _resolve_design_path(project_root: Path, config: dict[str, Any], design_node: str) -> Path:
1279
- candidate = Path(design_node)
1280
- if candidate.is_absolute():
1281
- if not candidate.is_file():
1282
- raise FileNotFoundError(f"design document not found: {design_node}")
1283
- _ensure_inside_project(project_root, candidate, "design document")
1284
- return candidate
1285
-
1286
- project_relative = project_root / candidate
1287
- if project_relative.is_file():
1288
- return project_relative
1280
+ """Resolve a ``source_design_doc`` reference to its canonical file path.
1281
+
1282
+ Uses the shared deterministic reference resolver (ACG axis-1). Recovery of a
1283
+ unique-basename reference (e.g. ``docs/api_interface_contract.md``
1284
+ ``docs/design/api_interface_contract.md``) is allowed and audited; ambiguous
1285
+ / unresolved / wrong-subcategory references honest-fail. The
1286
+ ``FileNotFoundError`` contract is preserved (the resolver raises a
1287
+ ``FileNotFoundError`` subclass).
1288
+ """
1289
+ from codd.reference_resolution import (
1290
+ ReferenceResolutionError,
1291
+ record_reference_resolution_event,
1292
+ record_resolution_failure,
1293
+ resolve_document_ref,
1294
+ )
1295
+ from codd.scanner import build_document_reference_index
1289
1296
 
1290
- node_paths = build_document_node_path_map(project_root, config)
1291
- mapped = node_paths.get(design_node)
1292
- if mapped is not None and (project_root / mapped).is_file():
1293
- return project_root / mapped
1297
+ index = build_document_reference_index(project_root, config)
1298
+ try:
1299
+ binding = resolve_document_ref(
1300
+ design_node,
1301
+ project_root=project_root,
1302
+ index=index,
1303
+ producer=None,
1304
+ ref_kind="source_design_doc",
1305
+ allow_recovery=True,
1306
+ )
1307
+ except ReferenceResolutionError as exc:
1308
+ record_resolution_failure(
1309
+ project_root,
1310
+ str(design_node),
1311
+ stage="implement_read",
1312
+ ref_kind="source_design_doc",
1313
+ producer=None,
1314
+ error=exc,
1315
+ )
1316
+ raise FileNotFoundError(f"design document not found: {design_node}") from exc
1294
1317
 
1295
- raise FileNotFoundError(f"design document not found: {design_node}")
1318
+ record_reference_resolution_event(
1319
+ project_root,
1320
+ binding,
1321
+ stage="implement_read",
1322
+ status="recovered" if binding.recovered else "exact",
1323
+ )
1324
+ if binding.canonical_path is None: # pragma: no cover - documents always have a path
1325
+ raise FileNotFoundError(f"design document not found: {design_node}")
1326
+ return project_root / binding.canonical_path
1296
1327
 
1297
1328
 
1298
1329
  def _relative_path(project_root: Path, path: Path) -> Path:
@@ -1729,6 +1760,7 @@ def _collect_dependency_documents(
1729
1760
  project_root: Path,
1730
1761
  initial_node_ids: list[str],
1731
1762
  node_paths: dict[str, Path],
1763
+ config: dict[str, Any] | None = None,
1732
1764
  ) -> tuple[list[DependencyDocument], list[dict[str, Any]]]:
1733
1765
  documents: list[DependencyDocument] = []
1734
1766
  conventions: list[dict[str, Any]] = []
@@ -1747,7 +1779,7 @@ def _collect_dependency_documents(
1747
1779
  resolved_node_id = node_id
1748
1780
  if rel_path is None:
1749
1781
  try:
1750
- context = _load_design_context(project_root, {}, node_id)
1782
+ context = _load_design_context(project_root, config or {}, node_id)
1751
1783
  except (FileNotFoundError, ValueError):
1752
1784
  if node_id in required_node_ids:
1753
1785
  missing.append(node_id)
@@ -190,6 +190,7 @@ class SubprocessAiCommandPlanDeriver(PlanDeriver):
190
190
  default_v_model_layer=layer,
191
191
  )
192
192
  tasks = apply_declarative_v_model_layers(tasks, design_docs)
193
+ tasks = canonicalize_derived_task_references(tasks, project_context)
193
194
 
194
195
  if write_cache:
195
196
  write_derived_task_cache(
@@ -294,6 +295,110 @@ def apply_declarative_v_model_layers(tasks: list[DerivedTask], design_docs: list
294
295
  return overridden
295
296
 
296
297
 
298
+ def canonicalize_derived_task_references(
299
+ tasks: list[DerivedTask],
300
+ project_context: Mapping[str, Any],
301
+ ) -> list[DerivedTask]:
302
+ """Bind each task's ``source_design_doc`` to a canonical document path.
303
+
304
+ This is the PRIMARY fix for the ACG axis-1 reference supply-demand gap: a
305
+ SUT-supplied ``source_design_doc`` (e.g. ``docs/api_interface_contract.md``)
306
+ is normalized to the canonical registered path
307
+ (``docs/design/api_interface_contract.md``) *before* the derived-task bundle
308
+ / cache is persisted, so every downstream stage (cache reuse, implement,
309
+ repair, audit) sees a reference that already binds to exactly one document.
310
+
311
+ * Already-correct references are a no-op.
312
+ * Recoverable references are rewritten and audited (silent recovery is
313
+ forbidden).
314
+ * Ambiguous / unresolved / wrong-subcategory references honest-fail at
315
+ derivation time — a guessed/broken reference is NEVER persisted.
316
+
317
+ Only ``source_design_doc`` is canonicalized here (``depends_on`` /
318
+ ``expected_outputs`` are deliberately out of scope per the design — they are
319
+ a separate change with different typing/ownership semantics).
320
+ """
321
+ if not tasks:
322
+ return tasks
323
+
324
+ from codd.reference_resolution import (
325
+ ReferenceResolutionError,
326
+ record_reference_resolution_event,
327
+ record_resolution_failure,
328
+ resolve_document_ref,
329
+ )
330
+ from codd.scanner import build_document_reference_index
331
+
332
+ project_root, config = _resolve_root_and_config(project_context)
333
+ if project_root is None or config is None:
334
+ # Cannot build an index without a project root + config; leave tasks
335
+ # untouched (read-time resolution remains the safety net for legacy /
336
+ # external paths). This mirrors the resolver's fail-closed boundary
337
+ # without breaking callers that never supplied a project context.
338
+ return tasks
339
+
340
+ index = build_document_reference_index(project_root, config)
341
+ canonical: list[DerivedTask] = []
342
+ for task in tasks:
343
+ raw_ref = task.source_design_doc
344
+ try:
345
+ binding = resolve_document_ref(
346
+ raw_ref,
347
+ project_root=project_root,
348
+ index=index,
349
+ producer=task.id,
350
+ ref_kind="source_design_doc",
351
+ allow_recovery=True,
352
+ )
353
+ except ReferenceResolutionError as exc:
354
+ record_resolution_failure(
355
+ project_root,
356
+ str(raw_ref),
357
+ stage="plan_derivation",
358
+ ref_kind="source_design_doc",
359
+ producer=task.id,
360
+ error=exc,
361
+ )
362
+ raise
363
+
364
+ record_reference_resolution_event(
365
+ project_root,
366
+ binding,
367
+ stage="plan_derivation",
368
+ status="recovered" if binding.recovered else "exact",
369
+ )
370
+
371
+ if binding.canonical_path and binding.canonical_path != raw_ref:
372
+ data = task.to_dict()
373
+ data["source_design_doc"] = binding.canonical_path
374
+ canonical.append(DerivedTask.from_dict(data))
375
+ else:
376
+ canonical.append(task)
377
+ return canonical
378
+
379
+
380
+ def _resolve_root_and_config(
381
+ project_context: Mapping[str, Any],
382
+ ) -> tuple[Path | None, dict[str, Any] | None]:
383
+ """Best-effort extraction of (project_root, config) for canonicalization."""
384
+ raw_root = project_context.get("project_root")
385
+ if not raw_root:
386
+ return None, None
387
+ project_root = Path(str(raw_root)).resolve()
388
+
389
+ config = project_context.get("config")
390
+ if isinstance(config, Mapping):
391
+ return project_root, dict(config)
392
+
393
+ from codd.config import load_project_config
394
+
395
+ try:
396
+ loaded = load_project_config(project_root)
397
+ except (FileNotFoundError, ValueError):
398
+ return None, None
399
+ return project_root, loaded
400
+
401
+
297
402
  def declarative_v_model_layer(node: Node) -> VModelLayer | None:
298
403
  attributes = node.attributes or {}
299
404
  direct = _layer_value(attributes.get("v_model_layer"))
@@ -0,0 +1,463 @@
1
+ """Deterministic reference-resolution contract for CoDD artifact references.
2
+
3
+ ACG axis-1 ("reference supply-demand coherence"): whenever artifact A names
4
+ artifact B (e.g. an implement task naming its ``source_design_doc``), that
5
+ reference is a *demand edge*. The edge must bind to **exactly one** registered
6
+ artifact identity before it can influence generation, repair, verification, or
7
+ green status — it must never travel downstream as a raw, possibly-broken
8
+ string.
9
+
10
+ This module provides the SHARED, deterministic resolver used at both
11
+ ingestion-time (``plan_deriver`` canonicalizes SUT-supplied refs before they
12
+ are persisted) and read-time (``implementer`` resolves the stored/legacy ref
13
+ when it reads a design doc).
14
+
15
+ Determinism is the safety contract. There is **NO fuzzy matching** here — no
16
+ Levenshtein, no partial/substring match, no stem similarity. The only
17
+ "recovery" allowed is *unique basename recovery*, and only when the raw ref is
18
+ basename-only or doc-root + basename form (it does not assert a concrete, and
19
+ possibly wrong, subcategory). Anything ambiguous or unresolved is an honest
20
+ failure (raised as :class:`FileNotFoundError` so existing
21
+ ``except FileNotFoundError`` call sites keep working). Silent binding to a
22
+ guessed artifact is forbidden, and every recovery / failure is recorded to the
23
+ audit sink.
24
+ """
25
+
26
+ from __future__ import annotations
27
+
28
+ from dataclasses import dataclass, field
29
+ import json
30
+ from pathlib import Path, PurePosixPath
31
+ from typing import TYPE_CHECKING
32
+
33
+ if TYPE_CHECKING: # pragma: no cover - typing only
34
+ from codd.scanner import DocumentEntry, DocumentReferenceIndex
35
+
36
+
37
+ # ═══════════════════════════════════════════════════════════
38
+ # Binding + failure types
39
+ # ═══════════════════════════════════════════════════════════
40
+
41
+
42
+ @dataclass(frozen=True)
43
+ class ReferenceBinding:
44
+ """A resolved binding from a raw reference to one canonical artifact."""
45
+
46
+ raw: str
47
+ ref_kind: str
48
+ canonical_id: str
49
+ canonical_path: str | None
50
+ artifact_type: str
51
+ method: str
52
+ recovered: bool
53
+ producer: str | None
54
+ candidates: tuple[str, ...] = ()
55
+
56
+
57
+ class ReferenceResolutionError(FileNotFoundError):
58
+ """A reference could not be bound to exactly one registered artifact.
59
+
60
+ Subclasses :class:`FileNotFoundError` so existing call sites that catch
61
+ ``FileNotFoundError`` (``implementer._resolve_design_path`` consumers,
62
+ ``plan derive`` CLI) keep catching it unchanged.
63
+ """
64
+
65
+ def __init__(self, reason: str, candidates: tuple[str, ...] = ()) -> None:
66
+ self.reason = reason
67
+ self.candidates = tuple(candidates)
68
+ message = f"reference resolution failed ({reason})"
69
+ if self.candidates:
70
+ message += f"; candidates: {', '.join(self.candidates)}"
71
+ super().__init__(message)
72
+
73
+
74
+ def _fail(reason: str, candidates: tuple[str, ...] = ()) -> "ReferenceResolutionError":
75
+ return ReferenceResolutionError(reason, candidates=tuple(candidates))
76
+
77
+
78
+ # ═══════════════════════════════════════════════════════════
79
+ # Text / path normalization helpers
80
+ # ═══════════════════════════════════════════════════════════
81
+
82
+
83
+ def normalize_text(raw_ref: str) -> str:
84
+ """Strip surrounding whitespace and surrounding quotes from a raw ref."""
85
+ text = str(raw_ref or "").strip()
86
+ if len(text) >= 2 and text[0] == text[-1] and text[0] in ("'", '"'):
87
+ text = text[1:-1].strip()
88
+ return text
89
+
90
+
91
+ def _normalize_posix(raw: str) -> str:
92
+ """Normalize backslashes to forward slashes and collapse ``.``/redundant parts.
93
+
94
+ Does NOT resolve ``..`` away (that would mask an escape attempt); callers
95
+ detect escapes separately via :func:`_escapes_project`.
96
+ """
97
+ candidate = raw.replace("\\", "/")
98
+ return PurePosixPath(candidate).as_posix()
99
+
100
+
101
+ def _escapes_project(norm: str, raw: str) -> bool:
102
+ """True when the (relative) reference tries to leave the project tree."""
103
+ if not norm:
104
+ return False
105
+ # Windows drive prefix e.g. "C:/..." or "C:\\...".
106
+ if len(raw) >= 2 and raw[1] == ":" and raw[0].isalpha():
107
+ return True
108
+ # Absolute-like.
109
+ if norm.startswith("/"):
110
+ return True
111
+ parts = PurePosixPath(norm).parts
112
+ return ".." in parts
113
+
114
+
115
+ # ═══════════════════════════════════════════════════════════
116
+ # Basename recovery guard (anti-false-green safety floor)
117
+ # ═══════════════════════════════════════════════════════════
118
+
119
+
120
+ def basename_recovery_allowed(
121
+ norm_ref: str,
122
+ entry: "DocumentEntry",
123
+ doc_roots: tuple[str, ...],
124
+ ) -> bool:
125
+ """Whether unique-basename recovery may bind ``norm_ref`` to ``entry``.
126
+
127
+ Recovery is allowed ONLY when the raw reference is "basename-only" or
128
+ "doc_root + basename" form — i.e. it does NOT assert a concrete (and
129
+ possibly wrong) subcategory under a document root.
130
+
131
+ The doc actually lives at ``docs/design/api_interface_contract.md``:
132
+
133
+ * ``api_interface_contract.md`` — basename only → allowed.
134
+ * ``docs/api_interface_contract.md`` — doc_root ``docs/`` + basename, no
135
+ subcategory → allowed.
136
+ * ``docs/test/api_interface_contract.md`` — asserts subdir ``test/`` which
137
+ is NOT the real ``design/`` → NOT allowed → honest-fail (the SUT may be
138
+ hallucinating a *different* document).
139
+
140
+ This guard is the anti-false-green safety floor: a weak SUT may be lifted
141
+ to green by an *unambiguous* recovery, but never by guessing past a
142
+ concrete, conflicting subpath.
143
+ """
144
+ name = PurePosixPath(norm_ref).name
145
+ if not name:
146
+ return False
147
+
148
+ # Form 1: basename only (no directory component at all).
149
+ if norm_ref == name:
150
+ return True
151
+
152
+ parent = PurePosixPath(norm_ref).parent.as_posix()
153
+ if parent in ("", "."):
154
+ return True
155
+
156
+ # Form 2: doc_root + basename (exactly one level: the configured doc root,
157
+ # with nothing asserted between the root and the file). The parent dir of
158
+ # the reference must be a configured document root.
159
+ normalized_roots = {_strip_trailing_slash(_normalize_posix(root)) for root in doc_roots}
160
+ normalized_roots.discard("")
161
+ if parent in normalized_roots:
162
+ return True
163
+
164
+ return False
165
+
166
+
167
+ def _strip_trailing_slash(value: str) -> str:
168
+ return value[:-1] if value.endswith("/") else value
169
+
170
+
171
+ # ═══════════════════════════════════════════════════════════
172
+ # Core resolver
173
+ # ═══════════════════════════════════════════════════════════
174
+
175
+
176
+ def resolve_document_ref(
177
+ raw_ref: str,
178
+ *,
179
+ project_root: Path,
180
+ index: "DocumentReferenceIndex",
181
+ producer: str | None,
182
+ ref_kind: str,
183
+ allow_recovery: bool = True,
184
+ ) -> ReferenceBinding:
185
+ """Bind a document reference to exactly one registered document.
186
+
187
+ Resolution ladder (deterministic, fail-closed). Raises
188
+ :class:`ReferenceResolutionError` (a ``FileNotFoundError``) when the
189
+ reference cannot bind to a single registered document.
190
+ """
191
+ raw = normalize_text(raw_ref)
192
+ if not raw:
193
+ raise _fail("empty_reference")
194
+ if "\x00" in raw:
195
+ raise _fail("invalid_reference")
196
+
197
+ # 2. Absolute path → must be inside project AND an existing file.
198
+ candidate = Path(raw)
199
+ if candidate.is_absolute():
200
+ _ensure_inside_project(project_root, candidate)
201
+ if candidate.is_file():
202
+ return _bind_path(
203
+ raw=raw,
204
+ ref_kind=ref_kind,
205
+ producer=producer,
206
+ project_root=project_root,
207
+ index=index,
208
+ file_path=candidate,
209
+ method="absolute_exact_path",
210
+ )
211
+ raise _fail("unresolved_absolute_path")
212
+
213
+ # 3. Normalize to posix; reject escapes.
214
+ norm = _normalize_posix(raw)
215
+ if _escapes_project(norm, raw):
216
+ raise _fail("reference_escapes_project")
217
+
218
+ # 4. Classify.
219
+ path_like = ("/" in norm) or ("\\" in raw) or norm.endswith(".md")
220
+
221
+ # 5. Exact project-relative path.
222
+ if path_like:
223
+ project_relative = project_root / norm
224
+ if project_relative.is_file():
225
+ entry = index.by_path.get(norm)
226
+ if entry is not None:
227
+ return _bind_entry(
228
+ raw=raw, ref_kind=ref_kind, producer=producer, entry=entry, method="exact_path"
229
+ )
230
+ # The file exists exactly as referenced but carries no CoDD
231
+ # frontmatter (unregistered). This is NOT a guess — the SUT named a
232
+ # real, existing path — so bind it with a synthetic doc:<path>
233
+ # identity rather than hard-failing. Honest-fail is reserved for
234
+ # refs that do not resolve to a concrete file; hard-failing an
235
+ # existing exact path would regress legacy/brownfield docs.
236
+ return _bind_unregistered_path(
237
+ raw=raw, ref_kind=ref_kind, producer=producer, rel_path=norm
238
+ )
239
+
240
+ # 6. Exact node_id.
241
+ node_matches = index.by_node_id.get(raw)
242
+ if node_matches:
243
+ if len(node_matches) == 1:
244
+ return _bind_entry(
245
+ raw=raw,
246
+ ref_kind=ref_kind,
247
+ producer=producer,
248
+ entry=node_matches[0],
249
+ method="exact_node_id",
250
+ )
251
+ raise _fail("ambiguous_node_id", candidates=_candidate_paths(node_matches))
252
+
253
+ # 7. Exact alias.
254
+ alias_matches = index.by_alias.get(norm)
255
+ if alias_matches:
256
+ if len(alias_matches) == 1:
257
+ return _bind_entry(
258
+ raw=raw,
259
+ ref_kind=ref_kind,
260
+ producer=producer,
261
+ entry=alias_matches[0],
262
+ method="exact_alias",
263
+ )
264
+ raise _fail("ambiguous_alias", candidates=_candidate_paths(alias_matches))
265
+
266
+ # 8. Unique basename recovery (only path-like markdown refs).
267
+ basename = PurePosixPath(norm).name
268
+ if allow_recovery and path_like and basename.endswith(".md"):
269
+ matches = index.by_basename.get(basename, [])
270
+ if len(matches) == 1 and basename_recovery_allowed(norm, matches[0], index.doc_roots):
271
+ return _bind_entry(
272
+ raw=raw,
273
+ ref_kind=ref_kind,
274
+ producer=producer,
275
+ entry=matches[0],
276
+ method="unique_basename_recovered",
277
+ recovered=True,
278
+ )
279
+ if len(matches) > 1:
280
+ raise _fail("ambiguous_basename", candidates=_candidate_paths(matches))
281
+
282
+ # 9. No match.
283
+ raise _fail("unresolved_reference")
284
+
285
+
286
+ def _ensure_inside_project(project_root: Path, path: Path) -> None:
287
+ root = project_root.resolve(strict=False)
288
+ resolved = path.resolve(strict=False)
289
+ try:
290
+ resolved.relative_to(root)
291
+ except ValueError as exc:
292
+ raise _fail("reference_escapes_project") from exc
293
+
294
+
295
+ def _candidate_paths(entries: list["DocumentEntry"]) -> tuple[str, ...]:
296
+ return tuple(entry.path.as_posix() for entry in entries)
297
+
298
+
299
+ def _bind_entry(
300
+ *,
301
+ raw: str,
302
+ ref_kind: str,
303
+ producer: str | None,
304
+ entry: "DocumentEntry",
305
+ method: str,
306
+ recovered: bool = False,
307
+ ) -> ReferenceBinding:
308
+ return ReferenceBinding(
309
+ raw=raw,
310
+ ref_kind=ref_kind,
311
+ canonical_id=entry.node_id,
312
+ canonical_path=entry.path.as_posix(),
313
+ artifact_type="document",
314
+ method=method,
315
+ recovered=recovered,
316
+ producer=producer,
317
+ candidates=(entry.path.as_posix(),),
318
+ )
319
+
320
+
321
+ def _bind_unregistered_path(
322
+ *,
323
+ raw: str,
324
+ ref_kind: str,
325
+ producer: str | None,
326
+ rel_path: str,
327
+ ) -> ReferenceBinding:
328
+ """Bind an existing-but-unregistered file path to a synthetic ``doc:<path>``.
329
+
330
+ Used when a reference names a real, existing file that carries no CoDD
331
+ frontmatter. Binding (rather than failing) preserves the pre-contract
332
+ behavior where an existing exact path always resolved; it is safe because
333
+ the SUT named a concrete existing path — no guessing is involved. The
334
+ synthetic ``doc:<path>`` identity matches scanner's node_id fallback.
335
+ """
336
+ return ReferenceBinding(
337
+ raw=raw,
338
+ ref_kind=ref_kind,
339
+ canonical_id=f"doc:{rel_path}",
340
+ canonical_path=rel_path,
341
+ artifact_type="document",
342
+ method="exact_path_unregistered",
343
+ recovered=False,
344
+ producer=producer,
345
+ candidates=(rel_path,),
346
+ )
347
+
348
+
349
+ def _bind_path(
350
+ *,
351
+ raw: str,
352
+ ref_kind: str,
353
+ producer: str | None,
354
+ project_root: Path,
355
+ index: "DocumentReferenceIndex",
356
+ file_path: Path,
357
+ method: str,
358
+ ) -> ReferenceBinding:
359
+ """Bind an absolute, in-project file path; prefer the registered identity."""
360
+ try:
361
+ rel = file_path.resolve(strict=False).relative_to(project_root.resolve(strict=False)).as_posix()
362
+ except ValueError:
363
+ rel = file_path.as_posix()
364
+ entry = index.by_path.get(rel)
365
+ if entry is None:
366
+ return _bind_unregistered_path(
367
+ raw=raw, ref_kind=ref_kind, producer=producer, rel_path=rel
368
+ )
369
+ return _bind_entry(
370
+ raw=raw, ref_kind=ref_kind, producer=producer, entry=entry, method=method
371
+ )
372
+
373
+
374
+ # ═══════════════════════════════════════════════════════════
375
+ # Audit sink
376
+ # ═══════════════════════════════════════════════════════════
377
+
378
+ AUDIT_RELATIVE_PATH = Path(".codd") / "audit" / "reference_resolution.jsonl"
379
+
380
+
381
+ def record_reference_resolution_event(
382
+ project_root: Path,
383
+ binding: ReferenceBinding | None,
384
+ *,
385
+ stage: str,
386
+ status: str,
387
+ candidates: tuple[str, ...] = (),
388
+ ) -> None:
389
+ """Append one JSON line describing a resolution outcome.
390
+
391
+ Best-effort: never raises. Silent recovery is forbidden — callers MUST
392
+ record recoveries and failures here. ``status`` is one of
393
+ ``exact | recovered | ambiguous | unresolved``.
394
+ """
395
+ try:
396
+ record: dict[str, object] = {
397
+ "event": "reference_resolution",
398
+ "stage": stage,
399
+ "producer": binding.producer if binding is not None else None,
400
+ "ref_kind": binding.ref_kind if binding is not None else None,
401
+ "raw": binding.raw if binding is not None else None,
402
+ "status": status,
403
+ "method": binding.method if binding is not None else None,
404
+ "canonical_id": binding.canonical_id if binding is not None else None,
405
+ "canonical_path": binding.canonical_path if binding is not None else None,
406
+ "candidates": list(binding.candidates if binding is not None else candidates),
407
+ }
408
+ audit_path = project_root / AUDIT_RELATIVE_PATH
409
+ audit_path.parent.mkdir(parents=True, exist_ok=True)
410
+ with audit_path.open("a", encoding="utf-8") as handle:
411
+ handle.write(json.dumps(record, sort_keys=True) + "\n")
412
+ except Exception: # pragma: no cover - audit is best-effort
413
+ return
414
+
415
+
416
+ def record_resolution_failure(
417
+ project_root: Path,
418
+ raw: str,
419
+ *,
420
+ stage: str,
421
+ ref_kind: str,
422
+ producer: str | None,
423
+ error: ReferenceResolutionError,
424
+ ) -> None:
425
+ """Record an honest-fail outcome (ambiguous/unresolved/etc.)."""
426
+ reason = getattr(error, "reason", "unresolved_reference")
427
+ status = "ambiguous" if reason.startswith("ambiguous") else "unresolved"
428
+ try:
429
+ record = {
430
+ "event": "reference_resolution",
431
+ "stage": stage,
432
+ "producer": producer,
433
+ "ref_kind": ref_kind,
434
+ "raw": raw,
435
+ "status": status,
436
+ "method": None,
437
+ "canonical_id": None,
438
+ "canonical_path": None,
439
+ "candidates": list(getattr(error, "candidates", ())),
440
+ "reason": reason,
441
+ "action": "honest_fail",
442
+ }
443
+ audit_path = project_root / AUDIT_RELATIVE_PATH
444
+ audit_path.parent.mkdir(parents=True, exist_ok=True)
445
+ with audit_path.open("a", encoding="utf-8") as handle:
446
+ handle.write(json.dumps(record, sort_keys=True) + "\n")
447
+ except Exception: # pragma: no cover - audit is best-effort
448
+ return
449
+
450
+
451
+ def _status_for_binding(binding: ReferenceBinding) -> str:
452
+ return "recovered" if binding.recovered else "exact"
453
+
454
+
455
+ __all__ = [
456
+ "ReferenceBinding",
457
+ "ReferenceResolutionError",
458
+ "resolve_document_ref",
459
+ "basename_recovery_allowed",
460
+ "normalize_text",
461
+ "record_reference_resolution_event",
462
+ "record_resolution_failure",
463
+ ]