codd-dev 3.7.0__tar.gz → 3.7.1__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 (637) hide show
  1. {codd_dev-3.7.0 → codd_dev-3.7.1}/PKG-INFO +1 -1
  2. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/__init__.py +1 -1
  3. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/cli.py +2 -0
  4. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/builder.py +93 -6
  5. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/checks/ci_health.py +47 -2
  6. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/extract_ai.py +231 -27
  7. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/parsing/__init__.py +1 -0
  8. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/parsing/_shared.py +19 -0
  9. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/parsing/python_ast.py +71 -0
  10. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/templates/codd.yaml.tmpl +3 -18
  11. {codd_dev-3.7.0 → codd_dev-3.7.1}/pyproject.toml +1 -1
  12. {codd_dev-3.7.0 → codd_dev-3.7.1}/.gitignore +0 -0
  13. {codd_dev-3.7.0 → codd_dev-3.7.1}/LICENSE +0 -0
  14. {codd_dev-3.7.0 → codd_dev-3.7.1}/README.md +0 -0
  15. {codd_dev-3.7.0 → codd_dev-3.7.1}/bench_fixture/README.md +0 -0
  16. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/__main__.py +0 -0
  17. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/_git_helper.py +0 -0
  18. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/action_outcome.py +0 -0
  19. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/ai_invoke.py +0 -0
  20. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/ai_patch.py +0 -0
  21. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/artifact_contract.py +0 -0
  22. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/artifact_ids.py +0 -0
  23. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/artifacts/catalog.yaml +0 -0
  24. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/ask_user_question_adapter.py +0 -0
  25. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/assembler.py +0 -0
  26. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/bridge.py +0 -0
  27. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/brownfield/__init__.py +0 -0
  28. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/brownfield/pipeline.py +0 -0
  29. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/capability_completeness.py +0 -0
  30. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/claude_cli.py +0 -0
  31. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/clustering.py +0 -0
  32. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/coherence_adapters.py +0 -0
  33. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/coherence_engine.py +0 -0
  34. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/confidence.py +0 -0
  35. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/config.py +0 -0
  36. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/config_schema.py +0 -0
  37. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/contracts.py +0 -0
  38. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/contracts_registry/__init__.py +0 -0
  39. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/contracts_registry/__main__.py +0 -0
  40. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/contracts_registry/certify.py +0 -0
  41. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/contracts_registry/generate_matrix.py +0 -0
  42. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/contracts_registry/registry.py +0 -0
  43. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/coverage_auditor.py +0 -0
  44. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/coverage_execution_coherence.py +0 -0
  45. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/coverage_metrics.py +0 -0
  46. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/__init__.py +0 -0
  47. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/auto_repair.py +0 -0
  48. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/checks/__init__.py +0 -0
  49. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/checks/_one_to_many_detection.py +0 -0
  50. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/checks/artifact_contract_check.py +0 -0
  51. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/checks/cardinality_coverage.py +0 -0
  52. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/checks/dependency_freshness.py +0 -0
  53. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/checks/depends_on_consistency.py +0 -0
  54. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/checks/deployment_completeness.py +0 -0
  55. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/checks/edge_validity.py +0 -0
  56. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/checks/environment_coverage.py +0 -0
  57. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/checks/extraction_diagnostics.py +0 -0
  58. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/checks/implementation_coverage.py +0 -0
  59. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/checks/negative_space.py +0 -0
  60. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/checks/node_completeness.py +0 -0
  61. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/checks/opt_out.py +0 -0
  62. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/checks/resource_flow_coherence.py +0 -0
  63. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/checks/semantic_contract_conflict.py +0 -0
  64. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/checks/stale_evidence.py +0 -0
  65. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/checks/task_completion.py +0 -0
  66. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/checks/transitive_closure.py +0 -0
  67. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/checks/ui_coherence.py +0 -0
  68. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/checks/user_journey_coherence.py +0 -0
  69. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/coverage_axes.py +0 -0
  70. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/defaults/cli.yaml +0 -0
  71. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/defaults/cpp_embedded.yaml +0 -0
  72. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/defaults/csharp.yaml +0 -0
  73. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/defaults/elixir.yaml +0 -0
  74. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/defaults/generic.yaml +0 -0
  75. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/defaults/iot.yaml +0 -0
  76. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/defaults/java.yaml +0 -0
  77. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/defaults/kotlin.yaml +0 -0
  78. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/defaults/mobile.yaml +0 -0
  79. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/defaults/ruby.yaml +0 -0
  80. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/defaults/rust.yaml +0 -0
  81. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/defaults/scala.yaml +0 -0
  82. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/defaults/swift.yaml +0 -0
  83. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/defaults/test_frameworks.yaml +0 -0
  84. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/defaults/web.yaml +0 -0
  85. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/extractor.py +0 -0
  86. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/impact.py +0 -0
  87. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/materiality.py +0 -0
  88. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/metadata_access.py +0 -0
  89. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/result_status.py +0 -0
  90. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/runner.py +0 -0
  91. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/defaults.py +0 -0
  92. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/defaults.yaml +0 -0
  93. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dependency_lock_coherence.py +0 -0
  94. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/deploy_targets/__init__.py +0 -0
  95. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/deploy_targets/app_service.py +0 -0
  96. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/deploy_targets/base.py +0 -0
  97. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/deploy_targets/docker_compose.py +0 -0
  98. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/deployer.py +0 -0
  99. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/deployment/__init__.py +0 -0
  100. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/deployment/checks/__init__.py +0 -0
  101. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/deployment/defaults/deploy_targets.yaml +0 -0
  102. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/deployment/defaults/runtime_capability_inference.yaml +0 -0
  103. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/deployment/defaults/schema_providers.yaml +0 -0
  104. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/deployment/defaults/verification_templates.yaml +0 -0
  105. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/deployment/extractor.py +0 -0
  106. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/deployment/providers/__init__.py +0 -0
  107. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/deployment/providers/ai_command.py +0 -0
  108. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/deployment/providers/ai_command_factory.py +0 -0
  109. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/deployment/providers/codex_app_server.py +0 -0
  110. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/deployment/providers/llm_consideration.py +0 -0
  111. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/deployment/providers/schema/__init__.py +0 -0
  112. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/deployment/providers/schema/prisma.py +0 -0
  113. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/deployment/providers/target/__init__.py +0 -0
  114. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/deployment/providers/target/docker_compose.py +0 -0
  115. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/deployment/providers/verification/__init__.py +0 -0
  116. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/deployment/providers/verification/assertion_handlers.py +0 -0
  117. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/deployment/providers/verification/cdp_browser.py +0 -0
  118. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/deployment/providers/verification/cdp_engines.py +0 -0
  119. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/deployment/providers/verification/cdp_launchers.py +0 -0
  120. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/deployment/providers/verification/cdp_wire.py +0 -0
  121. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/deployment/providers/verification/curl.py +0 -0
  122. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/deployment/providers/verification/form_strategies.py +0 -0
  123. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/deployment/providers/verification/means_catalog.py +0 -0
  124. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/deployment/providers/verification/playwright.py +0 -0
  125. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/deployment/providers/verification/pytest_http.py +0 -0
  126. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/deployment/providers/verification/vitest.py +0 -0
  127. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/design_md.py +0 -0
  128. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/diff/__init__.py +0 -0
  129. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/diff/apply.py +0 -0
  130. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/diff/engine.py +0 -0
  131. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/diff/persistence.py +0 -0
  132. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/diff/templates/diff_prompt.md +0 -0
  133. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/discovery.py +0 -0
  134. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/drift.py +0 -0
  135. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/e2e_contract_coherence.py +0 -0
  136. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/e2e_extractor.py +0 -0
  137. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/e2e_generator.py +0 -0
  138. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/e2e_harness.py +0 -0
  139. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/e2e_runner.py +0 -0
  140. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/elicit/__init__.py +0 -0
  141. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/elicit/apply.py +0 -0
  142. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/elicit/engine.py +0 -0
  143. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/elicit/finding.py +0 -0
  144. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/elicit/formatters/__init__.py +0 -0
  145. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/elicit/formatters/base.py +0 -0
  146. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/elicit/formatters/interactive.py +0 -0
  147. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/elicit/formatters/json_fmt.py +0 -0
  148. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/elicit/formatters/md.py +0 -0
  149. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/elicit/gap_to_ask.py +0 -0
  150. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/elicit/lexicon_loader.py +0 -0
  151. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/elicit/persistence.py +0 -0
  152. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/elicit/promote.py +0 -0
  153. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/elicit/routing.py +0 -0
  154. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/elicit/templates/elicit_prompt_L0.md +0 -0
  155. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/env_refs.py +0 -0
  156. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/extract_paths.py +0 -0
  157. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/extractor.py +0 -0
  158. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/fix/__init__.py +0 -0
  159. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/fix/candidate_selector.py +0 -0
  160. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/fix/design_updater.py +0 -0
  161. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/fix/impact_planner.py +0 -0
  162. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/fix/impl_propagation.py +0 -0
  163. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/fix/interactive_prompt.py +0 -0
  164. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/fix/phenomenon_fixer.py +0 -0
  165. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/fix/phenomenon_parser.py +0 -0
  166. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/fix/risk_classifier.py +0 -0
  167. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/fix/templates/clarification_question.txt +0 -0
  168. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/fix/templates/design_update.txt +0 -0
  169. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/fix/templates/impl_update.txt +0 -0
  170. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/fix/templates/phenomenon_parse.txt +0 -0
  171. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/fix/templates/risk_assessment.txt +0 -0
  172. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/fix/templates_loader.py +0 -0
  173. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/fixer.py +0 -0
  174. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/fixup_drift.py +0 -0
  175. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/fixup_drift_strategies/__init__.py +0 -0
  176. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/fixup_drift_strategies/design_token_drift.py +0 -0
  177. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/fixup_drift_strategies/lexicon_violation.py +0 -0
  178. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/fixup_drift_strategies/url_drift.py +0 -0
  179. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/frontmatter.py +0 -0
  180. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/generator.py +0 -0
  181. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/git_evidence.py +0 -0
  182. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/graph.py +0 -0
  183. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/greenfield/__init__.py +0 -0
  184. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/greenfield/pipeline.py +0 -0
  185. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/hitl_session.py +0 -0
  186. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/hooks/__init__.py +0 -0
  187. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/hooks/pre-commit +0 -0
  188. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/hooks/recipes/claude_requirements_nudge.json +0 -0
  189. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/hooks/recipes/claude_settings_example.json +0 -0
  190. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/hooks/recipes/codex_hook.sh +0 -0
  191. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/hooks/recipes/git_post_commit.sh +0 -0
  192. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/hooks/recipes/git_pre_commit.sh +0 -0
  193. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/iac_nfr.py +0 -0
  194. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/implement_oracle.py +0 -0
  195. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/implement_oracle_scope.py +0 -0
  196. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/implement_oracle_types.py +0 -0
  197. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/implementer/__init__.py +0 -0
  198. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/implementer/chunked_runner.py +0 -0
  199. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/implementer/typecheck_loop.py +0 -0
  200. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/implementer.py +0 -0
  201. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/import_coherence.py +0 -0
  202. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/inheritance.py +0 -0
  203. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/init/__init__.py +0 -0
  204. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/init/lexicon_suggest.py +0 -0
  205. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/init/llm_lexicon_suggester.py +0 -0
  206. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/init/stack_detector.py +0 -0
  207. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/knowledge_fetcher.py +0 -0
  208. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/languages/__init__.py +0 -0
  209. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/languages/adapters/__init__.py +0 -0
  210. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/languages/adapters/implement_oracle.py +0 -0
  211. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/languages/adapters/oracle_go.py +0 -0
  212. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/languages/adapters/oracle_python.py +0 -0
  213. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/languages/adapters/oracle_typescript.py +0 -0
  214. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/languages/adapters/runner_report.py +0 -0
  215. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/languages/builtin_adapters.py +0 -0
  216. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/languages/compat.py +0 -0
  217. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/languages/contract.py +0 -0
  218. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/languages/loader.py +0 -0
  219. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/languages/oracle_executor.py +0 -0
  220. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/languages/path_planner.py +0 -0
  221. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/languages/profile.py +0 -0
  222. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/languages/profiles/go.yaml +0 -0
  223. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/languages/profiles/python.yaml +0 -0
  224. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/languages/profiles/typescript.yaml +0 -0
  225. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/languages/registry.py +0 -0
  226. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/languages/verify_executor.py +0 -0
  227. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/languages/verify_plan.py +0 -0
  228. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/lexicon.py +0 -0
  229. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/lexicon_cli/__init__.py +0 -0
  230. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/lexicon_cli/formatters/__init__.py +0 -0
  231. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/lexicon_cli/formatters/html.py +0 -0
  232. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/lexicon_cli/formatters/json_fmt.py +0 -0
  233. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/lexicon_cli/formatters/md.py +0 -0
  234. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/lexicon_cli/inspector.py +0 -0
  235. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/lexicon_cli/manager.py +0 -0
  236. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/lexicon_cli/reporter.py +0 -0
  237. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/lexicon_cli/threshold.py +0 -0
  238. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/llm/__init__.py +0 -0
  239. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/llm/approval.py +0 -0
  240. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/llm/best_practice_augmenter.py +0 -0
  241. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/llm/criteria_expander.py +0 -0
  242. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/llm/design_doc_extractor.py +0 -0
  243. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/llm/impl_step_deriver.py +0 -0
  244. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/llm/means_catalog_loader.py +0 -0
  245. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/llm/parser.py +0 -0
  246. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/llm/plan_deriver.py +0 -0
  247. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/llm/prompt_builder.py +0 -0
  248. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/llm/strategy_validator.py +0 -0
  249. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/llm/templates/best_practice_augment_meta.md +0 -0
  250. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/llm/templates/criteria_expand_meta.md +0 -0
  251. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/llm/templates/design_doc_extract_meta.md +0 -0
  252. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/llm/templates/impl_step_derive_meta.md +0 -0
  253. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/llm/templates/implementation_step_catalog.yaml +0 -0
  254. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/llm/templates/meta_instruction.md +0 -0
  255. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/llm/templates/plan_derive_meta.md +0 -0
  256. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/llm/templates/verification_means_catalog.yaml +0 -0
  257. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/mcp_server.py +0 -0
  258. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/measure.py +0 -0
  259. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/operational_e2e_audit.py +0 -0
  260. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/operations_derive.py +0 -0
  261. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/parsing/api_specs.py +0 -0
  262. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/parsing/extractor_registry.py +0 -0
  263. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/parsing/filesystem_routes.py +0 -0
  264. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/parsing/iac.py +0 -0
  265. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/parsing/regex_strategies.py +0 -0
  266. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/parsing/schemas.py +0 -0
  267. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/parsing/tests_builddeps.py +0 -0
  268. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/parsing/treesitter.py +0 -0
  269. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/path_safety.py +0 -0
  270. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/planner.py +0 -0
  271. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/policy.py +0 -0
  272. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/preflight/__init__.py +0 -0
  273. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/preflight/defaults/cli.yaml +0 -0
  274. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/preflight/defaults/generic.yaml +0 -0
  275. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/preflight/defaults/iot.yaml +0 -0
  276. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/preflight/defaults/mobile.yaml +0 -0
  277. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/preflight/defaults/web.yaml +0 -0
  278. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/project_types.py +0 -0
  279. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/propagate.py +0 -0
  280. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/propagation_common.py +0 -0
  281. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/propagator.py +0 -0
  282. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/reconciliation_ledger.py +0 -0
  283. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/reference_resolution.py +0 -0
  284. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/registry.py +0 -0
  285. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/repair/__init__.py +0 -0
  286. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/repair/approval_repair.py +0 -0
  287. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/repair/auto_scope_guard.py +0 -0
  288. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/repair/engine.py +0 -0
  289. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/repair/git_patcher.py +0 -0
  290. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/repair/history.py +0 -0
  291. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/repair/llm_repair_engine.py +0 -0
  292. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/repair/loop.py +0 -0
  293. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/repair/primary_picker.py +0 -0
  294. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/repair/proof_breaks.py +0 -0
  295. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/repair/repair_result.py +0 -0
  296. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/repair/repairability_classifier.py +0 -0
  297. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/repair/schema.py +0 -0
  298. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/repair/templates/analyze_meta.md +0 -0
  299. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/repair/templates/propose_meta.md +0 -0
  300. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/repair/templates/repair_strategy_meta.md +0 -0
  301. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/repair/templates/repairability_meta.md +0 -0
  302. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/repair/test_failure_attribution.py +0 -0
  303. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/repair/verify_runner.py +0 -0
  304. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/repair_slice.py +0 -0
  305. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/require.py +0 -0
  306. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/require_plugins.py +0 -0
  307. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/require_propagate.py +0 -0
  308. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/required_artifacts/defaults/cli.yaml +0 -0
  309. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/required_artifacts/defaults/generic.yaml +0 -0
  310. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/required_artifacts/defaults/iot.yaml +0 -0
  311. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/required_artifacts/defaults/mobile.yaml +0 -0
  312. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/required_artifacts/defaults/web.yaml +0 -0
  313. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/required_artifacts_deriver.py +0 -0
  314. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/requirement_completeness/defaults/cli.yaml +0 -0
  315. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/requirement_completeness/defaults/generic.yaml +0 -0
  316. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/requirement_completeness/defaults/iot.yaml +0 -0
  317. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/requirement_completeness/defaults/mobile.yaml +0 -0
  318. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/requirement_completeness/defaults/web.yaml +0 -0
  319. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/requirement_completeness_auditor.py +0 -0
  320. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/requirement_reconciliation.py +0 -0
  321. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/requirements_meta.py +0 -0
  322. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/restoration_report.py +0 -0
  323. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/restore.py +0 -0
  324. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/routes_extractor.py +0 -0
  325. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/runtime_smoke/__init__.py +0 -0
  326. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/runtime_smoke/checks.py +0 -0
  327. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/runtime_smoke/config.py +0 -0
  328. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/runtime_smoke/report.py +0 -0
  329. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/runtime_smoke/runner.py +0 -0
  330. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/scanner.py +0 -0
  331. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/schema_refs.py +0 -0
  332. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/screen_flow_validator.py +0 -0
  333. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/screen_transition_extractor.py +0 -0
  334. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/screen_transitions/defaults.yaml +0 -0
  335. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/skills_cli/__init__.py +0 -0
  336. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/skills_cli/discovery.py +0 -0
  337. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/skills_cli/manager.py +0 -0
  338. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/skills_cli/paths.py +0 -0
  339. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/stack/__init__.py +0 -0
  340. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/stack/adapters/__init__.py +0 -0
  341. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/stack/adapters/_base.py +0 -0
  342. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/stack/adapters/nextjs.py +0 -0
  343. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/stack/adapters/playwright.py +0 -0
  344. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/stack/adapters/prisma.py +0 -0
  345. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/stack/command_authenticity.py +0 -0
  346. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/stack/command_override.py +0 -0
  347. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/stack/command_plan.py +0 -0
  348. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/stack/compose.py +0 -0
  349. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/stack/loader.py +0 -0
  350. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/stack/lock.py +0 -0
  351. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/stack/obligations.py +0 -0
  352. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/stack/profile.py +0 -0
  353. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/stack/profiles/addons/playwright.yaml +0 -0
  354. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/stack/profiles/addons/prisma.yaml +0 -0
  355. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/stack/profiles/frameworks/nextjs.yaml +0 -0
  356. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/stack/project.py +0 -0
  357. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/stack/registry.py +0 -0
  358. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/stack/replacement_proof.py +0 -0
  359. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/stack/resolve.py +0 -0
  360. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/surface_reconciliation.py +0 -0
  361. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/synth.py +0 -0
  362. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/templates/conventions.yaml.tmpl +0 -0
  363. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/templates/data_dependencies.yaml.tmpl +0 -0
  364. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/templates/doc_links.yaml.tmpl +0 -0
  365. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/templates/extract_ai_prompt_baseline.md +0 -0
  366. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/templates/extracted/api-contract.md.j2 +0 -0
  367. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/templates/extracted/architecture-overview.md.j2 +0 -0
  368. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/templates/extracted/module-detail.md.j2 +0 -0
  369. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/templates/extracted/schema-design.md.j2 +0 -0
  370. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/templates/extracted/system-context.md.j2 +0 -0
  371. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/templates/gitignore.tmpl +0 -0
  372. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/templates/lexicon_questions.md +0 -0
  373. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/templates/lexicon_schema.yaml +0 -0
  374. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/templates/overrides.yaml.tmpl +0 -0
  375. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/test_detection.py +0 -0
  376. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/test_import_coherence.py +0 -0
  377. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/traceability.py +0 -0
  378. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/validator.py +0 -0
  379. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/vb_marker_authenticity.py +0 -0
  380. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/vb_rerun_scope.py +0 -0
  381. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/verifiable_behavior_audit.py +0 -0
  382. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/watch/__init__.py +0 -0
  383. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/watch/events.py +0 -0
  384. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/watch/propagation_log.py +0 -0
  385. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/watch/propagation_pipeline.py +0 -0
  386. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/watch/test_runner.py +0 -0
  387. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/watch/watcher.py +0 -0
  388. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/wiring.py +0 -0
  389. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ai_governance_eu_act/coverage_matrix.md +0 -0
  390. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ai_governance_eu_act/elicit_extend.md +0 -0
  391. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ai_governance_eu_act/lexicon.yaml +0 -0
  392. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ai_governance_eu_act/manifest.yaml +0 -0
  393. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ai_governance_eu_act/recommended_kinds.yaml +0 -0
  394. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ai_governance_eu_act/severity_rules.yaml +0 -0
  395. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/api_rate_limiting_caching/coverage_matrix.md +0 -0
  396. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/api_rate_limiting_caching/elicit_extend.md +0 -0
  397. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/api_rate_limiting_caching/lexicon.yaml +0 -0
  398. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/api_rate_limiting_caching/manifest.yaml +0 -0
  399. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/api_rate_limiting_caching/recommended_kinds.yaml +0 -0
  400. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/api_rate_limiting_caching/severity_rules.yaml +0 -0
  401. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/api_rest_openapi/coverage_matrix.md +0 -0
  402. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/api_rest_openapi/elicit_extend.md +0 -0
  403. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/api_rest_openapi/lexicon.yaml +0 -0
  404. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/api_rest_openapi/manifest.yaml +0 -0
  405. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/api_rest_openapi/recommended_kinds.yaml +0 -0
  406. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/api_rest_openapi/severity_rules.yaml +0 -0
  407. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/babok/elicit_extend.md +0 -0
  408. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/babok/lexicon.yaml +0 -0
  409. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/babok/manifest.yaml +0 -0
  410. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/babok/recommended_kinds.yaml +0 -0
  411. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/babok/severity_rules.yaml +0 -0
  412. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/backend_event_cloudevents/coverage_matrix.md +0 -0
  413. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/backend_event_cloudevents/elicit_extend.md +0 -0
  414. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/backend_event_cloudevents/lexicon.yaml +0 -0
  415. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/backend_event_cloudevents/manifest.yaml +0 -0
  416. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/backend_event_cloudevents/recommended_kinds.yaml +0 -0
  417. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/backend_event_cloudevents/severity_rules.yaml +0 -0
  418. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/backend_graphql/coverage_matrix.md +0 -0
  419. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/backend_graphql/elicit_extend.md +0 -0
  420. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/backend_graphql/lexicon.yaml +0 -0
  421. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/backend_graphql/manifest.yaml +0 -0
  422. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/backend_graphql/recommended_kinds.yaml +0 -0
  423. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/backend_graphql/severity_rules.yaml +0 -0
  424. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/backend_grpc_proto/coverage_matrix.md +0 -0
  425. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/backend_grpc_proto/elicit_extend.md +0 -0
  426. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/backend_grpc_proto/lexicon.yaml +0 -0
  427. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/backend_grpc_proto/manifest.yaml +0 -0
  428. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/backend_grpc_proto/recommended_kinds.yaml +0 -0
  429. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/backend_grpc_proto/severity_rules.yaml +0 -0
  430. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/compliance_hipaa/coverage_matrix.md +0 -0
  431. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/compliance_hipaa/elicit_extend.md +0 -0
  432. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/compliance_hipaa/lexicon.yaml +0 -0
  433. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/compliance_hipaa/manifest.yaml +0 -0
  434. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/compliance_hipaa/recommended_kinds.yaml +0 -0
  435. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/compliance_hipaa/severity_rules.yaml +0 -0
  436. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/compliance_iso27001/coverage_matrix.md +0 -0
  437. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/compliance_iso27001/elicit_extend.md +0 -0
  438. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/compliance_iso27001/lexicon.yaml +0 -0
  439. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/compliance_iso27001/manifest.yaml +0 -0
  440. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/compliance_iso27001/recommended_kinds.yaml +0 -0
  441. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/compliance_iso27001/severity_rules.yaml +0 -0
  442. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/compliance_pci_dss_4/coverage_matrix.md +0 -0
  443. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/compliance_pci_dss_4/elicit_extend.md +0 -0
  444. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/compliance_pci_dss_4/lexicon.yaml +0 -0
  445. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/compliance_pci_dss_4/manifest.yaml +0 -0
  446. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/compliance_pci_dss_4/recommended_kinds.yaml +0 -0
  447. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/compliance_pci_dss_4/severity_rules.yaml +0 -0
  448. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/data_aggregation_policies/coverage_matrix.md +0 -0
  449. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/data_aggregation_policies/elicit_extend.md +0 -0
  450. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/data_aggregation_policies/lexicon.yaml +0 -0
  451. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/data_aggregation_policies/manifest.yaml +0 -0
  452. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/data_aggregation_policies/recommended_kinds.yaml +0 -0
  453. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/data_aggregation_policies/severity_rules.yaml +0 -0
  454. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/coverage_matrix.md +0 -0
  455. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/elicit_extend.md +0 -0
  456. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/lexicon.yaml +0 -0
  457. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/manifest.yaml +0 -0
  458. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/recommended_kinds.yaml +0 -0
  459. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/severity_rules.yaml +0 -0
  460. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/data_governance_appi_gdpr/coverage_matrix.md +0 -0
  461. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/data_governance_appi_gdpr/elicit_extend.md +0 -0
  462. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/data_governance_appi_gdpr/lexicon.yaml +0 -0
  463. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/data_governance_appi_gdpr/manifest.yaml +0 -0
  464. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/data_governance_appi_gdpr/recommended_kinds.yaml +0 -0
  465. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/data_governance_appi_gdpr/severity_rules.yaml +0 -0
  466. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/data_nosql_jsonschema/coverage_matrix.md +0 -0
  467. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/data_nosql_jsonschema/elicit_extend.md +0 -0
  468. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/data_nosql_jsonschema/lexicon.yaml +0 -0
  469. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/data_nosql_jsonschema/manifest.yaml +0 -0
  470. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/data_nosql_jsonschema/recommended_kinds.yaml +0 -0
  471. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/data_nosql_jsonschema/severity_rules.yaml +0 -0
  472. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/data_relational_iso_sql/coverage_matrix.md +0 -0
  473. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/data_relational_iso_sql/elicit_extend.md +0 -0
  474. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/data_relational_iso_sql/lexicon.yaml +0 -0
  475. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/data_relational_iso_sql/manifest.yaml +0 -0
  476. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/data_relational_iso_sql/recommended_kinds.yaml +0 -0
  477. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/data_relational_iso_sql/severity_rules.yaml +0 -0
  478. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ddd_domain_driven_design/coverage_matrix.md +0 -0
  479. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ddd_domain_driven_design/elicit_extend.md +0 -0
  480. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ddd_domain_driven_design/lexicon.yaml +0 -0
  481. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ddd_domain_driven_design/manifest.yaml +0 -0
  482. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ddd_domain_driven_design/recommended_kinds.yaml +0 -0
  483. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ddd_domain_driven_design/severity_rules.yaml +0 -0
  484. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/dora_sre_metrics/coverage_matrix.md +0 -0
  485. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/dora_sre_metrics/elicit_extend.md +0 -0
  486. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/dora_sre_metrics/lexicon.yaml +0 -0
  487. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/dora_sre_metrics/manifest.yaml +0 -0
  488. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/dora_sre_metrics/recommended_kinds.yaml +0 -0
  489. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/dora_sre_metrics/severity_rules.yaml +0 -0
  490. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/i18n_unicode_cldr/coverage_matrix.md +0 -0
  491. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/i18n_unicode_cldr/elicit_extend.md +0 -0
  492. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/i18n_unicode_cldr/lexicon.yaml +0 -0
  493. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/i18n_unicode_cldr/manifest.yaml +0 -0
  494. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/i18n_unicode_cldr/recommended_kinds.yaml +0 -0
  495. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/i18n_unicode_cldr/severity_rules.yaml +0 -0
  496. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ml_model_cards/coverage_matrix.md +0 -0
  497. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ml_model_cards/elicit_extend.md +0 -0
  498. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ml_model_cards/lexicon.yaml +0 -0
  499. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ml_model_cards/manifest.yaml +0 -0
  500. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ml_model_cards/recommended_kinds.yaml +0 -0
  501. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ml_model_cards/severity_rules.yaml +0 -0
  502. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/mobile_a11y_native/coverage_matrix.md +0 -0
  503. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/mobile_a11y_native/elicit_extend.md +0 -0
  504. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/mobile_a11y_native/lexicon.yaml +0 -0
  505. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/mobile_a11y_native/manifest.yaml +0 -0
  506. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/mobile_a11y_native/recommended_kinds.yaml +0 -0
  507. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/mobile_a11y_native/severity_rules.yaml +0 -0
  508. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/mobile_android_material3/coverage_matrix.md +0 -0
  509. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/mobile_android_material3/elicit_extend.md +0 -0
  510. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/mobile_android_material3/lexicon.yaml +0 -0
  511. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/mobile_android_material3/manifest.yaml +0 -0
  512. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/mobile_android_material3/recommended_kinds.yaml +0 -0
  513. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/mobile_android_material3/severity_rules.yaml +0 -0
  514. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/mobile_ios_hig/coverage_matrix.md +0 -0
  515. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/mobile_ios_hig/elicit_extend.md +0 -0
  516. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/mobile_ios_hig/lexicon.yaml +0 -0
  517. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/mobile_ios_hig/manifest.yaml +0 -0
  518. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/mobile_ios_hig/recommended_kinds.yaml +0 -0
  519. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/mobile_ios_hig/severity_rules.yaml +0 -0
  520. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/mobile_security_masvs/coverage_matrix.md +0 -0
  521. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/mobile_security_masvs/elicit_extend.md +0 -0
  522. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/mobile_security_masvs/lexicon.yaml +0 -0
  523. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/mobile_security_masvs/manifest.yaml +0 -0
  524. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/mobile_security_masvs/recommended_kinds.yaml +0 -0
  525. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/mobile_security_masvs/severity_rules.yaml +0 -0
  526. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ops_cicd_pipeline/coverage_matrix.md +0 -0
  527. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ops_cicd_pipeline/elicit_extend.md +0 -0
  528. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ops_cicd_pipeline/lexicon.yaml +0 -0
  529. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ops_cicd_pipeline/manifest.yaml +0 -0
  530. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ops_cicd_pipeline/recommended_kinds.yaml +0 -0
  531. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ops_cicd_pipeline/severity_rules.yaml +0 -0
  532. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ops_iac_terraform/coverage_matrix.md +0 -0
  533. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ops_iac_terraform/elicit_extend.md +0 -0
  534. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ops_iac_terraform/lexicon.yaml +0 -0
  535. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ops_iac_terraform/manifest.yaml +0 -0
  536. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ops_iac_terraform/recommended_kinds.yaml +0 -0
  537. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ops_iac_terraform/severity_rules.yaml +0 -0
  538. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ops_kubernetes/coverage_matrix.md +0 -0
  539. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ops_kubernetes/elicit_extend.md +0 -0
  540. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ops_kubernetes/lexicon.yaml +0 -0
  541. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ops_kubernetes/manifest.yaml +0 -0
  542. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ops_kubernetes/recommended_kinds.yaml +0 -0
  543. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ops_kubernetes/severity_rules.yaml +0 -0
  544. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ops_observability_otel/coverage_matrix.md +0 -0
  545. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ops_observability_otel/elicit_extend.md +0 -0
  546. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ops_observability_otel/lexicon.yaml +0 -0
  547. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ops_observability_otel/manifest.yaml +0 -0
  548. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ops_observability_otel/recommended_kinds.yaml +0 -0
  549. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ops_observability_otel/severity_rules.yaml +0 -0
  550. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/process_iso25010/coverage_matrix.md +0 -0
  551. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/process_iso25010/elicit_extend.md +0 -0
  552. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/process_iso25010/lexicon.yaml +0 -0
  553. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/process_iso25010/manifest.yaml +0 -0
  554. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/process_iso25010/recommended_kinds.yaml +0 -0
  555. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/process_iso25010/severity_rules.yaml +0 -0
  556. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/process_test_iso29119/coverage_matrix.md +0 -0
  557. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/process_test_iso29119/elicit_extend.md +0 -0
  558. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/process_test_iso29119/lexicon.yaml +0 -0
  559. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/process_test_iso29119/manifest.yaml +0 -0
  560. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/process_test_iso29119/recommended_kinds.yaml +0 -0
  561. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/process_test_iso29119/severity_rules.yaml +0 -0
  562. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/twelve_factor_app/coverage_matrix.md +0 -0
  563. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/twelve_factor_app/elicit_extend.md +0 -0
  564. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/twelve_factor_app/lexicon.yaml +0 -0
  565. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/twelve_factor_app/manifest.yaml +0 -0
  566. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/twelve_factor_app/recommended_kinds.yaml +0 -0
  567. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/twelve_factor_app/severity_rules.yaml +0 -0
  568. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_a11y_wcag22_aa/coverage_matrix.md +0 -0
  569. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_a11y_wcag22_aa/elicit_extend.md +0 -0
  570. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_a11y_wcag22_aa/lexicon.yaml +0 -0
  571. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_a11y_wcag22_aa/manifest.yaml +0 -0
  572. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_a11y_wcag22_aa/recommended_kinds.yaml +0 -0
  573. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_a11y_wcag22_aa/severity_rules.yaml +0 -0
  574. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_authn_webauthn/coverage_matrix.md +0 -0
  575. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_authn_webauthn/elicit_extend.md +0 -0
  576. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_authn_webauthn/lexicon.yaml +0 -0
  577. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_authn_webauthn/manifest.yaml +0 -0
  578. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_authn_webauthn/recommended_kinds.yaml +0 -0
  579. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_authn_webauthn/severity_rules.yaml +0 -0
  580. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_browser_compat/coverage_matrix.md +0 -0
  581. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_browser_compat/elicit_extend.md +0 -0
  582. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_browser_compat/lexicon.yaml +0 -0
  583. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_browser_compat/manifest.yaml +0 -0
  584. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_browser_compat/recommended_kinds.yaml +0 -0
  585. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_browser_compat/severity_rules.yaml +0 -0
  586. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_forms_html5/coverage_matrix.md +0 -0
  587. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_forms_html5/elicit_extend.md +0 -0
  588. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_forms_html5/lexicon.yaml +0 -0
  589. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_forms_html5/manifest.yaml +0 -0
  590. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_forms_html5/recommended_kinds.yaml +0 -0
  591. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_forms_html5/severity_rules.yaml +0 -0
  592. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_performance_core_web_vitals/coverage_matrix.md +0 -0
  593. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_performance_core_web_vitals/elicit_extend.md +0 -0
  594. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_performance_core_web_vitals/lexicon.yaml +0 -0
  595. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_performance_core_web_vitals/manifest.yaml +0 -0
  596. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_performance_core_web_vitals/recommended_kinds.yaml +0 -0
  597. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_performance_core_web_vitals/severity_rules.yaml +0 -0
  598. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_pwa_manifest/coverage_matrix.md +0 -0
  599. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_pwa_manifest/elicit_extend.md +0 -0
  600. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_pwa_manifest/lexicon.yaml +0 -0
  601. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_pwa_manifest/manifest.yaml +0 -0
  602. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_pwa_manifest/recommended_kinds.yaml +0 -0
  603. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_pwa_manifest/severity_rules.yaml +0 -0
  604. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_responsive/coverage_matrix.md +0 -0
  605. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_responsive/elicit_extend.md +0 -0
  606. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_responsive/lexicon.yaml +0 -0
  607. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_responsive/manifest.yaml +0 -0
  608. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_responsive/recommended_kinds.yaml +0 -0
  609. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_responsive/severity_rules.yaml +0 -0
  610. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_security_owasp/coverage_matrix.md +0 -0
  611. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_security_owasp/elicit_extend.md +0 -0
  612. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_security_owasp/lexicon.yaml +0 -0
  613. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_security_owasp/manifest.yaml +0 -0
  614. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_security_owasp/recommended_kinds.yaml +0 -0
  615. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_security_owasp/severity_rules.yaml +0 -0
  616. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_seo_schemaorg/coverage_matrix.md +0 -0
  617. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_seo_schemaorg/elicit_extend.md +0 -0
  618. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_seo_schemaorg/lexicon.yaml +0 -0
  619. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_seo_schemaorg/manifest.yaml +0 -0
  620. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_seo_schemaorg/recommended_kinds.yaml +0 -0
  621. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_seo_schemaorg/severity_rules.yaml +0 -0
  622. {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/stack_map.yaml +0 -0
  623. {codd_dev-3.7.0 → codd_dev-3.7.1}/docs/cookbook/cdp_browser/README.md +0 -0
  624. {codd_dev-3.7.0 → codd_dev-3.7.1}/docs/cookbook/presentation_aggregation/README.md +0 -0
  625. {codd_dev-3.7.0 → codd_dev-3.7.1}/docs/requirements/README.md +0 -0
  626. {codd_dev-3.7.0 → codd_dev-3.7.1}/examples/README.md +0 -0
  627. {codd_dev-3.7.0 → codd_dev-3.7.1}/skills/codd-assemble/SKILL.md +0 -0
  628. {codd_dev-3.7.0 → codd_dev-3.7.1}/skills/codd-evolve/SKILL.md +0 -0
  629. {codd_dev-3.7.0 → codd_dev-3.7.1}/skills/codd-generate/SKILL.md +0 -0
  630. {codd_dev-3.7.0 → codd_dev-3.7.1}/skills/codd-greenfield/SKILL.md +0 -0
  631. {codd_dev-3.7.0 → codd_dev-3.7.1}/skills/codd-impact/SKILL.md +0 -0
  632. {codd_dev-3.7.0 → codd_dev-3.7.1}/skills/codd-init/SKILL.md +0 -0
  633. {codd_dev-3.7.0 → codd_dev-3.7.1}/skills/codd-propagate/SKILL.md +0 -0
  634. {codd_dev-3.7.0 → codd_dev-3.7.1}/skills/codd-restore/SKILL.md +0 -0
  635. {codd_dev-3.7.0 → codd_dev-3.7.1}/skills/codd-scan/SKILL.md +0 -0
  636. {codd_dev-3.7.0 → codd_dev-3.7.1}/skills/codd-validate/SKILL.md +0 -0
  637. {codd_dev-3.7.0 → codd_dev-3.7.1}/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: 3.7.0
3
+ Version: 3.7.1
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__ = "3.7.0"
3
+ __version__ = "3.7.1"
@@ -5862,6 +5862,8 @@ def extract(
5862
5862
  click.echo(f"Output: {output_display}/")
5863
5863
  for f in result.generated_files:
5864
5864
  click.echo(f" {f.name}")
5865
+ for warning in getattr(result, "parse_warnings", []):
5866
+ click.echo(f" WARNING: {warning}")
5865
5867
  if generated_config:
5866
5868
  click.echo(f"Generated: {config_display} (minimal brownfield config)")
5867
5869
 
@@ -44,7 +44,6 @@ LEGACY_IMPLEMENTATION_SUFFIXES = (".ts", ".tsx", ".js", ".jsx", ".py", ".go", ".
44
44
  LEGACY_TEST_SUFFIXES = (".ts", ".tsx", ".js", ".jsx", ".py", ".go", ".bats")
45
45
  PLAN_HEADER_RE = re.compile(r"^#{2,6}\s+([A-Za-z0-9]+(?:[-_.][A-Za-z0-9]+)*)(?:\s+(.+))?$", re.MULTILINE)
46
46
  OUTPUTS_RE = re.compile(r"(?im)^outputs?[ \t]*:[ \t]*(.*)$")
47
- PY_IMPORT_RE = re.compile(r"(?m)^\s*(?:from\s+([A-Za-z_][\w.]*)(?:\s+import\s+)|import\s+([A-Za-z_][\w.]*))")
48
47
  LEXICON_OUTPUT_PREFIX = "lexicon:"
49
48
  EXPECTED_ARTIFACT_ATTRIBUTE_KEYS = (
50
49
  "id",
@@ -298,7 +297,7 @@ def _add_impl_files(dag: DAG, project_root: Path, settings: dict[str, Any]) -> d
298
297
  path=node_id,
299
298
  attributes={
300
299
  "language": _language_for_path(file_path),
301
- "imports": extract_imports(file_path),
300
+ "imports": _extract_impl_imports(file_path),
302
301
  "runtime_evidence": _runtime_evidence_for_file(file_path, node_id, capability_patterns),
303
302
  },
304
303
  ),
@@ -913,13 +912,28 @@ def _resolve_import_target(
913
912
  aliases: dict[str, list[str]],
914
913
  ) -> str | None:
915
914
  candidates: list[Path] = []
916
- if import_ref.startswith("."):
915
+ if _is_js_relative_specifier(import_ref):
916
+ # JS/TS relative: ``./foo`` / ``../foo`` — resolve against the file dir
917
+ # exactly as before (a path with a separator after the dots).
917
918
  candidates.append((file_path.parent / import_ref).resolve())
919
+ elif import_ref.startswith("."):
920
+ # Python relative: ``.b`` / ``..pkg.x`` / ``.`` — leading dots select a
921
+ # package directory (1 dot = current package, 2 = parent, …) and the
922
+ # dotted remainder maps to a sub-path. Distinct from JS ``./`` because
923
+ # Python uses ``.`` as the component separator, so ``pkg/.b`` (the old
924
+ # JS-style join) never matched ``pkg/b.py``.
925
+ candidates.extend(_python_relative_candidates(import_ref, file_path))
918
926
  elif import_ref.startswith("/"):
919
927
  candidates.append((project_root / import_ref.lstrip("/")).resolve())
920
928
  else:
921
929
  candidates.extend(_alias_candidates(import_ref, project_root, aliases))
922
930
  candidates.append((project_root / import_ref).resolve())
931
+ # Absolute dotted module specifier (``pkg.c`` / ``a.b.c``): also try the
932
+ # dotted→path mapping rooted at the project, so a Python absolute import
933
+ # resolves to ``pkg/c.py`` (``__init__.py`` handled downstream). The
934
+ # plain join above keeps ``pkg/sub`` directory-style specifiers working.
935
+ if "." in import_ref:
936
+ candidates.append((project_root / Path(*import_ref.split("."))).resolve())
923
937
 
924
938
  for candidate in candidates:
925
939
  resolved = _resolve_file_candidate(candidate, path_to_node)
@@ -928,6 +942,45 @@ def _resolve_import_target(
928
942
  return None
929
943
 
930
944
 
945
+ def _is_js_relative_specifier(import_ref: str) -> bool:
946
+ """True for JS/TS relative specifiers (``./x`` / ``../x`` / ``.`` / ``..``).
947
+
948
+ The discriminator is purely the SHAPE of the specifier (data), not a
949
+ language flag: JS relative imports put a path separator after the leading
950
+ dots (or are the bare ``.`` / ``..`` directory refs), whereas Python
951
+ relative imports use ``.`` as the module-component separator (``.b``,
952
+ ``..pkg.mod``). Keeping the JS branch byte-identical preserves the existing
953
+ TS/JS edge behavior.
954
+ """
955
+
956
+ if import_ref in (".", ".."):
957
+ return True
958
+ return import_ref.startswith("./") or import_ref.startswith("../")
959
+
960
+
961
+ def _python_relative_candidates(import_ref: str, file_path: Path) -> list[Path]:
962
+ """Resolve a Python relative import specifier to filesystem candidates.
963
+
964
+ Mirrors Python's own relative-import semantics: ``leading_dots`` counts the
965
+ package levels (1 = the importing file's package == its directory, 2 = the
966
+ parent package, …); the remaining dotted name becomes sub-directories.
967
+ ``_resolve_file_candidate`` then appends the real suffix / ``__init__.py``.
968
+ """
969
+
970
+ leading_dots = len(import_ref) - len(import_ref.lstrip("."))
971
+ remainder = import_ref[leading_dots:]
972
+
973
+ # 1 dot → current package dir (the file's own directory); each extra dot
974
+ # walks one package up.
975
+ base = file_path.parent
976
+ for _ in range(leading_dots - 1):
977
+ base = base.parent
978
+
979
+ if not remainder:
980
+ return [base.resolve()]
981
+ return [(base / Path(*remainder.split("."))).resolve()]
982
+
983
+
931
984
  def _infer_test_targets(
932
985
  test_path: Path,
933
986
  project_root: Path,
@@ -954,14 +1007,48 @@ def _infer_test_targets(
954
1007
  return targets
955
1008
 
956
1009
 
1010
+ def _extract_python_import_specifiers(file_path: Path) -> list[str]:
1011
+ """Return raw Python import specifiers (relative dots preserved) via AST.
1012
+
1013
+ Dispatches to the registry's Python ``source`` backend
1014
+ (:class:`codd.parsing.PythonAstExtractor`) so the SAME stdlib-``ast``
1015
+ extraction that the scanner uses produces the DAG's specifiers — including
1016
+ relative imports (``.b`` / ``from . import d`` / ``..pkg.x``) that the old
1017
+ line-anchored regex (a ``from ([A-Za-z_]…)`` pattern that could not match a
1018
+ leading-dot module) silently dropped. Selection is registry-DATA-driven
1019
+ (``get_extractor``), not a ``language ==`` branch.
1020
+ """
1021
+
1022
+ from codd.parsing import get_extractor
1023
+
1024
+ content = file_path.read_text(encoding="utf-8", errors="ignore")
1025
+ return get_extractor("python", "source").extract_import_specifiers(content)
1026
+
1027
+
1028
+ def _extract_impl_imports(file_path: Path) -> list[str]:
1029
+ """Return raw import specifiers for an implementation file.
1030
+
1031
+ Python impl files go through AST-based specifier extraction (the same path
1032
+ test files use) so impl→impl import edges form for Python — the core of the
1033
+ fix. Every other language keeps the existing quoted-specifier extractor
1034
+ (``extract_imports``: JS/TS ``from '…'`` / ``require('…')``), unchanged.
1035
+ Dispatch is by file suffix (DATA), mirroring ``_extract_test_imports``.
1036
+ """
1037
+
1038
+ if file_path.suffix == ".py":
1039
+ return _extract_python_import_specifiers(file_path)
1040
+ return extract_imports(file_path)
1041
+
1042
+
957
1043
  def _extract_test_imports(file_path: Path) -> list[str]:
958
1044
  imports = extract_imports(file_path)
959
1045
  if file_path.suffix != ".py":
960
1046
  return imports
961
1047
 
962
- content = file_path.read_text(encoding="utf-8", errors="ignore")
963
- python_imports = [match.group(1) or match.group(2) for match in PY_IMPORT_RE.finditer(content)]
964
- return [*imports, *python_imports]
1048
+ # AST-based Python specifiers (relative imports included). Combined with the
1049
+ # quoted-specifier pass above so a polyglot test file (e.g. a ``.py`` test
1050
+ # that also embeds a JS ``require('…')`` literal in a string) keeps both.
1051
+ return [*imports, *_extract_python_import_specifiers(file_path)]
965
1052
 
966
1053
 
967
1054
  def _resolve_python_import_target(import_ref: str, project_root: Path, path_to_node: dict[Path, str]) -> str | None:
@@ -24,10 +24,19 @@ _DEFAULT_PROVIDER = "github" + "_actions"
24
24
  _OPT_OUT_PROVIDER = "none"
25
25
 
26
26
 
27
+ # GitHub Actions officially loads workflow files with EITHER ``.yml`` or
28
+ # ``.yaml``. The default glob therefore matches both extensions (comma-separated
29
+ # union — see ``_locate_workflows``). A user who narrows ``workflow_glob`` to a
30
+ # single pattern keeps exact control (an explicit ``*.yaml`` pulls in only
31
+ # ``.yaml``); only the DEFAULT spans both so the common ``.yaml``-only project
32
+ # (e.g. Flask) is not mis-RED-flagged ``ci_workflow_missing``.
33
+ _DEFAULT_WORKFLOW_GLOB = ".github/workflows/*.yml,.github/workflows/*.yaml"
34
+
35
+
27
36
  @dataclass
28
37
  class CiConfig:
29
38
  provider: str = _DEFAULT_PROVIDER
30
- workflow_glob: str = ".github/workflows/*.yml"
39
+ workflow_glob: str = _DEFAULT_WORKFLOW_GLOB
31
40
  required_triggers: list[str] = field(default_factory=lambda: ["push", "pull_request"])
32
41
  runtime_check: bool = False
33
42
  staleness_days: int = 14
@@ -241,7 +250,43 @@ class CiHealthCheck(DagCheck):
241
250
  project_root: Path,
242
251
  workflow_glob: str,
243
252
  ) -> tuple[list[Path], list[str]]:
244
- """Resolve in-root workflow files via the shared path_safety jail.
253
+ """Resolve in-root workflow files for one OR MORE comma-separated globs.
254
+
255
+ ``workflow_glob`` may carry several patterns separated by commas (the
256
+ default spans both ``*.yml`` and ``*.yaml`` because GitHub Actions loads
257
+ either extension). Each sub-glob is resolved independently through the
258
+ shared path_safety jail (see :meth:`_locate_one_glob`); the in-root
259
+ matches are unioned + de-duplicated, and any out-of-root markers are
260
+ accumulated so a single escaping sub-glob still surfaces a structured red
261
+ finding. A single (comma-free) pattern behaves exactly as before, so a
262
+ user who narrows ``workflow_glob`` to one pattern keeps exact control.
263
+ """
264
+
265
+ sub_globs = [part.strip() for part in workflow_glob.split(",") if part.strip()]
266
+ if not sub_globs:
267
+ return [], []
268
+
269
+ seen: set[Path] = set()
270
+ in_root: list[Path] = []
271
+ out_of_root: list[str] = []
272
+ for sub in sub_globs:
273
+ files, escaped = self._locate_one_glob(project_root, sub)
274
+ for path in files:
275
+ if path not in seen:
276
+ seen.add(path)
277
+ in_root.append(path)
278
+ for marker in escaped:
279
+ if marker not in out_of_root:
280
+ out_of_root.append(marker)
281
+ in_root.sort()
282
+ return in_root, out_of_root
283
+
284
+ def _locate_one_glob(
285
+ self,
286
+ project_root: Path,
287
+ workflow_glob: str,
288
+ ) -> tuple[list[Path], list[str]]:
289
+ """Resolve in-root workflow files for ONE glob via the path_safety jail.
245
290
 
246
291
  The glob root is validated *before* enumeration. An absolute
247
292
  ``workflow_glob`` whose static (non-magic) base escapes the project root
@@ -13,7 +13,9 @@ from __future__ import annotations
13
13
 
14
14
  from dataclasses import dataclass, field
15
15
  from pathlib import Path
16
+ import re
16
17
  from typing import Any
18
+ import warnings
17
19
 
18
20
  import yaml
19
21
 
@@ -31,6 +33,11 @@ from codd.discovery import (
31
33
 
32
34
  PROMPT_TEMPLATE_FILE = Path(__file__).parent / "templates" / "extract_ai_prompt_baseline.md"
33
35
 
36
+ # The extract prompt targets six MECE layers (L1 data … L6 tests). Recovering
37
+ # fewer documents from the model's output is surfaced as an advisory warning
38
+ # (never a hard failure: not every project populates all six layers).
39
+ _EXPECTED_EXTRACT_LAYER_COUNT = 6
40
+
34
41
  # Files to always read if they exist (framework detection)
35
42
  FRAMEWORK_FILES = [
36
43
  "package.json", "requirements.txt", "Pipfile", "pyproject.toml",
@@ -107,6 +114,9 @@ class ExtractAIResult:
107
114
  generated_files: list[Path] = field(default_factory=list)
108
115
  ai_raw_output: str = ""
109
116
  module_count: int = 0
117
+ # Advisory parse warnings (e.g. fewer documents recovered than the six MECE
118
+ # layers expected) surfaced to the caller instead of silently dropping docs.
119
+ parse_warnings: list[str] = field(default_factory=list)
110
120
 
111
121
 
112
122
  # ═══════════════════════════════════════════════════════════
@@ -498,37 +508,218 @@ def _safe_output_path(output_dir: Path, name: str) -> Path:
498
508
  return candidate
499
509
 
500
510
 
501
- def _parse_ai_output(raw: str, output_dir: Path) -> list[Path]:
502
- """Parse AI output separated by `--- FILE: <name> ---` markers.
511
+ _FENCE_RE = re.compile(r"^\s*```+[A-Za-z0-9_-]*\s*$")
512
+ _FILE_MARKER_RE = re.compile(r"^\s*---\s*FILE:\s*(?P<name>.+?)\s*---\s*$")
513
+ _LAYER_HEADER_RE = re.compile(r"^\s*#{1,6}\s*L\d+\b.*$")
514
+
515
+
516
+ def _strip_outer_fence(raw: str) -> str:
517
+ """Drop a single code-fence wrapper around the WHOLE response.
503
518
 
504
- All writes are confined to *output_dir*; traversal/absolute names are
505
- rejected (fail-closed) so extraction can never clobber source/user files.
519
+ Models routinely wrap their entire reply in ```` ```markdown … ``` ````.
520
+ Left in place, the leading fence lands at byte 0 and breaks frontmatter
521
+ normalization (which requires ``---`` at byte 0), and the trailing fence
522
+ leaks into the last document. Only the OUTER wrapper is removed: a fence as
523
+ the first non-blank line paired with a fence as the last non-blank line.
524
+ Inner code blocks inside a document body are untouched.
506
525
  """
507
- files: list[Path] = []
526
+ lines = raw.split("\n")
527
+ first = next((i for i, ln in enumerate(lines) if ln.strip()), None)
528
+ if first is None:
529
+ return raw
530
+ last = next(i for i in range(len(lines) - 1, -1, -1) if lines[i].strip())
531
+ if first < last and _FENCE_RE.match(lines[first]) and _FENCE_RE.match(lines[last]):
532
+ return "\n".join(lines[first + 1 : last])
533
+ return raw
534
+
535
+
536
+ def _strip_doc_fences(body: str) -> str:
537
+ """Strip a code-fence wrapper around a SINGLE parsed document segment.
538
+
539
+ Per-document fences appear when a model fences each doc individually (the
540
+ Flask shape mixed a single ``--- FILE:`` marker with per-doc fences). Only a
541
+ leading fence as the first non-blank line and/or a trailing fence as the
542
+ last non-blank line are removed, so a real code block in the middle of a
543
+ document body is preserved.
544
+ """
545
+ lines = body.split("\n")
546
+ start = 0
547
+ end = len(lines)
548
+ while start < end and not lines[start].strip():
549
+ start += 1
550
+ if start < end and _FENCE_RE.match(lines[start]):
551
+ lines = lines[:start] + lines[start + 1 :]
552
+ end = len(lines)
553
+ while end > 0 and not lines[end - 1].strip():
554
+ end -= 1
555
+ if end > 0 and _FENCE_RE.match(lines[end - 1]):
556
+ lines = lines[: end - 1] + lines[end:]
557
+ return "\n".join(lines)
558
+
559
+
560
+ def _split_on_file_markers(raw: str) -> list[tuple[str | None, str]]:
561
+ """Split on ``--- FILE: <name> ---`` markers (the canonical format).
562
+
563
+ Returns ``(name, body)`` segments. A leading segment before the first
564
+ marker has ``name=None`` (it is preamble, not a file) — callers decide
565
+ whether to keep it.
566
+ """
567
+ segments: list[tuple[str | None, str]] = []
508
568
  current_name: str | None = None
509
569
  current_lines: list[str] = []
570
+ for line in raw.split("\n"):
571
+ match = _FILE_MARKER_RE.match(line)
572
+ if match:
573
+ segments.append((current_name, "\n".join(current_lines)))
574
+ current_name = match.group("name").strip()
575
+ current_lines = []
576
+ else:
577
+ current_lines.append(line)
578
+ segments.append((current_name, "\n".join(current_lines)))
579
+ return segments
580
+
581
+
582
+ def _split_on_frontmatter_docs(raw: str) -> list[str] | None:
583
+ """Fallback: split a multi-document body on ``^---`` frontmatter blocks.
584
+
585
+ Used when the model separated docs by repeated ``---``-delimited frontmatter
586
+ rather than ``--- FILE:`` markers. A document starts at a ``---`` line whose
587
+ matching close ``---`` is followed by more content. Returns ``None`` when
588
+ fewer than two frontmatter docs are present (nothing to recover by this
589
+ strategy).
590
+ """
591
+ lines = raw.split("\n")
592
+ # Index every standalone ``---`` delimiter (frontmatter fences are bare ---).
593
+ delims = [i for i, ln in enumerate(lines) if ln.strip() == "---"]
594
+ if len(delims) < 4: # need at least two open/close pairs for >=2 docs
595
+ return None
596
+ # A doc opens at delims[0], delims[2], delims[4], ... (every other delimiter
597
+ # is an opener; the one between is its closer).
598
+ openers = delims[0::2]
599
+ if len(openers) < 2:
600
+ return None
601
+ segments: list[str] = []
602
+ for idx, start in enumerate(openers):
603
+ end = openers[idx + 1] if idx + 1 < len(openers) else len(lines)
604
+ segments.append("\n".join(lines[start:end]))
605
+ return [seg for seg in segments if seg.strip()]
606
+
607
+
608
+ def _split_on_layer_headers(raw: str) -> list[str] | None:
609
+ """Fallback: split on ``# L<n>: …`` layer headers.
610
+
611
+ Used when there is neither a ``--- FILE:`` marker nor per-doc frontmatter,
612
+ but the body carries the canonical six-layer ``# L1:`` … ``# L6:`` headers.
613
+ Returns ``None`` when fewer than two layer headers are present.
614
+ """
615
+ lines = raw.split("\n")
616
+ starts = [i for i, ln in enumerate(lines) if _LAYER_HEADER_RE.match(ln)]
617
+ if len(starts) < 2:
618
+ return None
619
+ segments: list[str] = []
620
+ for idx, start in enumerate(starts):
621
+ end = starts[idx + 1] if idx + 1 < len(starts) else len(lines)
622
+ segments.append("\n".join(lines[start:end]))
623
+ return [seg for seg in segments if seg.strip()]
510
624
 
511
- def _flush(name: str, lines: list[str]) -> None:
625
+
626
+ def _segment_node_name(body: str, index: int) -> str:
627
+ """Derive a stable output filename for a marker-less recovered segment.
628
+
629
+ Prefers an ``id:`` from the segment's frontmatter, then a ``# L<n>:`` header
630
+ token, finally a positional fallback. Always yields a ``.md`` name confined
631
+ later by :func:`_safe_output_path`.
632
+ """
633
+ fm = re.match(r"\A\s*---\s*\n(.*?)\n---\s*(?:\n|$)", body, re.DOTALL)
634
+ if fm:
635
+ try:
636
+ front = yaml.safe_load(fm.group(1)) or {}
637
+ except yaml.YAMLError:
638
+ front = {}
639
+ if isinstance(front, dict):
640
+ for key in ("node_id", "id", "name"):
641
+ value = front.get(key)
642
+ if isinstance(value, str) and value.strip():
643
+ slug = re.sub(r"[^A-Za-z0-9._-]+", "_", value.strip()).strip("_")
644
+ if slug:
645
+ return slug if slug.endswith(".md") else f"{slug}.md"
646
+ header = _LAYER_HEADER_RE.match(body.lstrip("\n").split("\n", 1)[0] if body.strip() else "")
647
+ if header:
648
+ token = re.search(r"L\d+", header.group(0))
649
+ if token:
650
+ return f"{token.group(0)}_extracted.md"
651
+ return f"extracted_doc_{index + 1}.md"
652
+
653
+
654
+ def _parse_ai_output(
655
+ raw: str,
656
+ output_dir: Path,
657
+ *,
658
+ expected_doc_count: int | None = None,
659
+ warnings_out: list[str] | None = None,
660
+ ) -> list[Path]:
661
+ """Parse AI extract output into per-document files (fence/format tolerant).
662
+
663
+ Resilient to two real failure modes seen in brownfield dogfood runs:
664
+
665
+ 1. The model wraps its whole reply (or each document) in a ```` ```markdown ````
666
+ code fence — stripped so ``---`` lands at byte 0 for frontmatter
667
+ normalization.
668
+ 2. The model separates documents by repeated ``^---`` frontmatter blocks or
669
+ ``# L<n>:`` layer headers instead of ``--- FILE:`` markers — recovered by
670
+ fallback splitting so documents are not silently collapsed/dropped.
671
+
672
+ When *expected_doc_count* is given and fewer files are persisted, a loud
673
+ warning is appended to *warnings_out* (surfaced in the extract result)
674
+ rather than dropping documents silently. All writes are confined to
675
+ *output_dir*; traversal/absolute names are rejected (fail-closed) so
676
+ extraction can never clobber source/user files.
677
+ """
678
+ warnings = warnings_out if warnings_out is not None else []
679
+ files: list[Path] = []
680
+
681
+ def _flush(name: str, body: str) -> None:
512
682
  out_path = _safe_output_path(output_dir, name)
513
683
  out_path.parent.mkdir(parents=True, exist_ok=True)
514
- out_path.write_text("\n".join(lines), encoding="utf-8")
684
+ out_path.write_text(_strip_doc_fences(body), encoding="utf-8")
515
685
  files.append(out_path)
516
686
 
517
- for line in raw.split("\n"):
518
- stripped = line.strip()
519
- if stripped.startswith("--- FILE:") and stripped.endswith("---"):
520
- # Flush previous file
521
- if current_name:
522
- _flush(current_name, current_lines)
523
- # Start new file
524
- current_name = stripped.replace("--- FILE:", "").replace("---", "").strip()
525
- current_lines = []
526
- else:
527
- current_lines.append(line)
687
+ de_fenced = _strip_outer_fence(raw)
688
+ marker_segments = _split_on_file_markers(de_fenced)
689
+ named = [(name, body) for name, body in marker_segments if name]
528
690
 
529
- # Flush last file
530
- if current_name:
531
- _flush(current_name, current_lines)
691
+ if len(named) >= 2:
692
+ # Canonical multi-file format — keep historical behavior.
693
+ for name, body in named:
694
+ _flush(name, body)
695
+ else:
696
+ # 0-1 FILE markers: recover documents the model separated another way
697
+ # rather than collapsing everything into a single (or zero) file.
698
+ fallback = _split_on_frontmatter_docs(de_fenced) or _split_on_layer_headers(de_fenced)
699
+ if fallback:
700
+ if named:
701
+ # Preserve the one explicitly-named doc, then recover the rest.
702
+ name, body = named[0]
703
+ _flush(name, body)
704
+ fallback = [seg for seg in fallback if seg.strip() != _strip_doc_fences(body).strip()]
705
+ for index, segment in enumerate(fallback):
706
+ _flush(_segment_node_name(segment, index), segment)
707
+ elif named:
708
+ name, body = named[0]
709
+ _flush(name, body)
710
+ else:
711
+ # Single plain document (no markers, no recoverable separators):
712
+ # write it as one file instead of silently dropping it.
713
+ if de_fenced.strip():
714
+ _flush(_segment_node_name(de_fenced, 0), de_fenced)
715
+
716
+ if expected_doc_count is not None and len(files) < expected_doc_count:
717
+ warnings.append(
718
+ f"AI extract parsed only {len(files)} document(s) but {expected_doc_count} "
719
+ f"were expected — the model's output format may be malformed (check "
720
+ f"_raw_ai_output.txt). No documents were silently dropped; review the raw "
721
+ f"output and re-run extract if incomplete."
722
+ )
532
723
 
533
724
  return files
534
725
 
@@ -636,20 +827,33 @@ def run_extract_ai(
636
827
  # Phase 3: AI invocation
637
828
  raw_output = _invoke_ai_command(ai_command, prompt)
638
829
 
639
- # Phase 4: Parse and write
640
- generated = _parse_ai_output(raw_output, out)
830
+ # Always persist the raw output FIRST so it survives even if parsing below
831
+ # hits a fail-closed path-safety error — it is the recovery artifact when the
832
+ # model's format is malformed.
833
+ raw_path = out / "_raw_ai_output.txt"
834
+ raw_path.write_text(raw_output, encoding="utf-8")
835
+
836
+ # Phase 4: Parse and write. The extractor targets the six MECE layers
837
+ # (L1-L6); recovering fewer documents is surfaced as an advisory warning
838
+ # (never a silent drop) so an under-parse is visible at the call site.
839
+ parse_warnings: list[str] = []
840
+ generated = _parse_ai_output(
841
+ raw_output,
842
+ out,
843
+ expected_doc_count=_EXPECTED_EXTRACT_LAYER_COUNT,
844
+ warnings_out=parse_warnings,
845
+ )
846
+ for message in parse_warnings:
847
+ warnings.warn(message, stacklevel=2)
641
848
 
642
849
  # Phase 4b: Normalize node identity to canonical codd.node_id so the DAG can
643
850
  # link restored docs the same way it links greenfield-generated docs.
644
851
  _normalize_extracted_frontmatter(generated)
645
852
 
646
- # Also save raw output
647
- raw_path = out / "_raw_ai_output.txt"
648
- raw_path.write_text(raw_output, encoding="utf-8")
649
-
650
853
  return ExtractAIResult(
651
854
  output_dir=out,
652
855
  generated_files=generated,
653
856
  ai_raw_output=raw_output,
654
857
  module_count=len(scan.source_files),
858
+ parse_warnings=parse_warnings,
655
859
  )
@@ -58,6 +58,7 @@ from codd.parsing.python_ast import (
58
58
  _PY_BUILTIN_CALLS,
59
59
  _detect_python_code_patterns_stdlib,
60
60
  _extract_python_call_graph_stdlib,
61
+ _extract_python_import_specifiers_stdlib,
61
62
  _extract_python_imports_stdlib,
62
63
  _extract_python_symbols_stdlib,
63
64
  _header_until_colon,
@@ -113,6 +113,18 @@ class LanguageExtractor(Protocol):
113
113
  ) -> tuple[dict[str, list[str]], set[str]]:
114
114
  """Return internal and external imports for the given source content."""
115
115
 
116
+ def extract_import_specifiers(self, content: str) -> list[str]:
117
+ """Return RAW import specifiers (un-resolved) for DAG edge building.
118
+
119
+ Distinct from :meth:`extract_imports` (which classifies into the
120
+ scanner's internal/external module graph): this returns the literal
121
+ specifier strings the DAG builder resolves against the node file-set
122
+ (e.g. Python ``.b`` / ``pkg.c``). Backends that don't carry intra-tree
123
+ specifiers (or where the builder already extracts them another way)
124
+ return ``[]``.
125
+ """
126
+ return []
127
+
116
128
  def detect_code_patterns(self, mod: ModuleInfo, content: str) -> None:
117
129
  """Mutate ModuleInfo with any detected structural patterns."""
118
130
 
@@ -151,6 +163,13 @@ class RegexExtractor:
151
163
  file_path,
152
164
  )
153
165
 
166
+ def extract_import_specifiers(self, content: str) -> list[str]:
167
+ # Best-effort fallback: the regex backend has no language-agnostic raw
168
+ # specifier extraction. Non-Python source files keep flowing through the
169
+ # builder's quoted-specifier path (``extract_imports`` in
170
+ # ``codd.dag.extractor``), so returning ``[]`` here is a no-op for them.
171
+ return []
172
+
154
173
  def detect_code_patterns(self, mod: ModuleInfo, content: str) -> None:
155
174
  from codd import extractor as extractor_module
156
175
 
@@ -56,6 +56,32 @@ class PythonAstExtractor:
56
56
  return {}, set()
57
57
  return _extract_python_imports_stdlib(tree, content, file_path, project_root, src_dir)
58
58
 
59
+ def extract_import_specifiers(self, content: str) -> list[str]:
60
+ """Return raw Python import specifiers (dots preserved), in source order.
61
+
62
+ Unlike :meth:`extract_imports` — which classifies imports into the
63
+ scanner's internal/external module graph keyed by normalized module
64
+ names — this returns the RAW dotted module strings exactly as written,
65
+ with leading dots preserved for relative imports (``.b``, ``..pkg.x``,
66
+ ``.`` for a bare ``from . import name`` package ref). The DAG builder
67
+ resolves these against the actual node file-set, so it needs the literal
68
+ specifier, not a normalized key.
69
+
70
+ AST-based (stdlib ``ast``) so multi-line / parenthesized / aliased
71
+ imports and — critically — relative imports are all captured. The
72
+ previous regex seam (``PY_IMPORT_RE``) silently dropped every relative
73
+ import. Syntax errors yield ``[]`` (the file's other facts are kept by
74
+ the caller), matching the rest of this backend.
75
+ """
76
+
77
+ if self.category != "source":
78
+ return []
79
+ try:
80
+ tree = ast.parse(content)
81
+ except (SyntaxError, ValueError, TypeError):
82
+ return []
83
+ return _extract_python_import_specifiers_stdlib(tree)
84
+
59
85
  def detect_code_patterns(self, mod: ModuleInfo, content: str) -> None:
60
86
  if self.category != "source":
61
87
  return None
@@ -317,6 +343,51 @@ def _extract_python_imports_stdlib(
317
343
  external -= _python_stdlib()
318
344
  return internal, external
319
345
 
346
+ def _extract_python_import_specifiers_stdlib(tree: ast.AST) -> list[str]:
347
+ """Return raw dotted import specifiers (relative dots preserved) in order.
348
+
349
+ * ``import os, pkg.sub`` → ``["os", "pkg.sub"]``
350
+ * ``from pkg.c import y`` → ``["pkg.c"]``
351
+ * ``from .b import x`` → ``[".b"]`` (one leading dot per ``node.level``)
352
+ * ``from . import d`` → ``[".d"]`` (the imported submodule of the package)
353
+ * ``from ..pkg2 import w`` → ``["..pkg2"]``
354
+
355
+ Deterministic source order (``ast.walk`` is BFS, so sort by line/col) and
356
+ de-duplicated while preserving first-seen order, so the DAG builds a stable
357
+ edge set across runs.
358
+ """
359
+
360
+ located: list[tuple[int, int, str]] = []
361
+ for node in ast.walk(tree):
362
+ if isinstance(node, ast.Import):
363
+ for alias in node.names:
364
+ if alias.name:
365
+ located.append((node.lineno, node.col_offset, alias.name))
366
+ elif isinstance(node, ast.ImportFrom):
367
+ prefix = "." * node.level
368
+ if node.module:
369
+ located.append((node.lineno, node.col_offset, f"{prefix}{node.module}"))
370
+ elif prefix:
371
+ # ``from . import a, b`` — each name is a SUBMODULE of the
372
+ # relative package (``.a`` / ``.b``), so emit one specifier per
373
+ # imported name. The builder resolves each to its ``.py`` /
374
+ # package so the real intra-package edge forms. (``*`` cannot
375
+ # appear in a no-module relative import, so no filtering needed.)
376
+ for alias in node.names:
377
+ if alias.name:
378
+ located.append(
379
+ (node.lineno, node.col_offset, f"{prefix}{alias.name}")
380
+ )
381
+
382
+ located.sort(key=lambda item: (item[0], item[1]))
383
+ seen: set[str] = set()
384
+ specifiers: list[str] = []
385
+ for _lineno, _col, specifier in located:
386
+ if specifier not in seen:
387
+ seen.add(specifier)
388
+ specifiers.append(specifier)
389
+ return specifiers
390
+
320
391
  def _detect_python_code_patterns_stdlib(mod: ModuleInfo, tree: ast.AST, content: str) -> None:
321
392
  docstring = ast.get_docstring(tree, clean=True)
322
393
  if docstring: