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.
- {codd_dev-2.35.0 → codd_dev-2.36.0}/PKG-INFO +1 -1
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/__init__.py +1 -1
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/implementer.py +48 -16
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/llm/plan_deriver.py +105 -0
- codd_dev-2.36.0/codd/reference_resolution.py +463 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/scanner.py +151 -8
- {codd_dev-2.35.0 → codd_dev-2.36.0}/pyproject.toml +1 -1
- {codd_dev-2.35.0 → codd_dev-2.36.0}/.gitignore +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/LICENSE +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/README.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/bench_fixture/README.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/__main__.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/_git_helper.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/action_outcome.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/ai_invoke.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/ai_patch.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/artifact_contract.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/artifact_ids.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/artifacts/catalog.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/ask_user_question_adapter.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/assembler.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/bridge.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/brownfield/__init__.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/brownfield/pipeline.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/capability_completeness.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/claude_cli.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/cli.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/clustering.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/coherence_adapters.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/coherence_engine.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/confidence.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/config.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/config_schema.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/contracts.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/coverage_auditor.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/coverage_execution_coherence.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/coverage_metrics.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/dag/__init__.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/dag/auto_repair.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/dag/builder.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/dag/checks/__init__.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/dag/checks/_one_to_many_detection.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/dag/checks/artifact_contract_check.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/dag/checks/ci_health.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/dag/checks/dependency_freshness.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/dag/checks/depends_on_consistency.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/dag/checks/deployment_completeness.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/dag/checks/edge_validity.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/dag/checks/environment_coverage.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/dag/checks/implementation_coverage.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/dag/checks/node_completeness.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/dag/checks/opt_out.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/dag/checks/task_completion.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/dag/checks/transitive_closure.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/dag/checks/ui_coherence.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/dag/checks/user_journey_coherence.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/dag/coverage_axes.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/dag/defaults/cli.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/dag/defaults/cpp_embedded.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/dag/defaults/csharp.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/dag/defaults/elixir.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/dag/defaults/generic.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/dag/defaults/iot.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/dag/defaults/java.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/dag/defaults/kotlin.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/dag/defaults/mobile.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/dag/defaults/ruby.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/dag/defaults/rust.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/dag/defaults/scala.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/dag/defaults/swift.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/dag/defaults/test_frameworks.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/dag/defaults/web.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/dag/extractor.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/dag/impact.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/dag/runner.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/defaults.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/defaults.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/dependency_lock_coherence.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/deploy_targets/__init__.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/deploy_targets/app_service.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/deploy_targets/base.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/deploy_targets/docker_compose.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/deployer.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/deployment/__init__.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/deployment/checks/__init__.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/deployment/defaults/deploy_targets.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/deployment/defaults/runtime_capability_inference.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/deployment/defaults/schema_providers.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/deployment/defaults/verification_templates.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/deployment/extractor.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/deployment/providers/__init__.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/deployment/providers/ai_command.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/deployment/providers/ai_command_factory.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/deployment/providers/codex_app_server.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/deployment/providers/llm_consideration.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/deployment/providers/schema/__init__.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/deployment/providers/schema/prisma.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/deployment/providers/target/__init__.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/deployment/providers/target/docker_compose.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/deployment/providers/verification/__init__.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/deployment/providers/verification/assertion_handlers.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/deployment/providers/verification/cdp_browser.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/deployment/providers/verification/cdp_engines.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/deployment/providers/verification/cdp_launchers.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/deployment/providers/verification/cdp_wire.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/deployment/providers/verification/curl.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/deployment/providers/verification/form_strategies.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/deployment/providers/verification/means_catalog.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/deployment/providers/verification/playwright.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/deployment/providers/verification/vitest.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/design_md.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/diff/__init__.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/diff/apply.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/diff/engine.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/diff/persistence.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/diff/templates/diff_prompt.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/discovery.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/drift.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/e2e_contract_coherence.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/e2e_extractor.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/e2e_generator.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/e2e_runner.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/elicit/__init__.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/elicit/apply.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/elicit/engine.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/elicit/finding.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/elicit/formatters/__init__.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/elicit/formatters/base.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/elicit/formatters/interactive.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/elicit/formatters/json_fmt.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/elicit/formatters/md.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/elicit/lexicon_loader.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/elicit/persistence.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/elicit/templates/elicit_prompt_L0.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/env_refs.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/extract_ai.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/extract_paths.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/extractor.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/fix/__init__.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/fix/candidate_selector.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/fix/design_updater.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/fix/impl_propagation.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/fix/interactive_prompt.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/fix/phenomenon_fixer.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/fix/phenomenon_parser.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/fix/risk_classifier.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/fix/templates/clarification_question.txt +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/fix/templates/design_update.txt +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/fix/templates/impl_update.txt +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/fix/templates/phenomenon_parse.txt +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/fix/templates/risk_assessment.txt +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/fix/templates_loader.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/fixer.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/fixup_drift.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/fixup_drift_strategies/__init__.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/fixup_drift_strategies/design_token_drift.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/fixup_drift_strategies/lexicon_violation.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/fixup_drift_strategies/url_drift.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/frontmatter.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/generator.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/git_evidence.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/graph.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/greenfield/__init__.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/greenfield/pipeline.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/hitl_session.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/hooks/__init__.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/hooks/pre-commit +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/hooks/recipes/claude_requirements_nudge.json +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/hooks/recipes/claude_settings_example.json +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/hooks/recipes/codex_hook.sh +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/hooks/recipes/git_post_commit.sh +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/hooks/recipes/git_pre_commit.sh +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/iac_nfr.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/implement_oracle.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/implement_oracle_scope.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/implementer/__init__.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/implementer/chunked_runner.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/implementer/typecheck_loop.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/import_coherence.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/inheritance.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/init/__init__.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/init/lexicon_suggest.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/init/llm_lexicon_suggester.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/init/stack_detector.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/knowledge_fetcher.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/lexicon.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/lexicon_cli/__init__.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/lexicon_cli/formatters/__init__.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/lexicon_cli/formatters/html.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/lexicon_cli/formatters/json_fmt.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/lexicon_cli/formatters/md.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/lexicon_cli/inspector.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/lexicon_cli/manager.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/lexicon_cli/reporter.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/lexicon_cli/threshold.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/llm/__init__.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/llm/approval.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/llm/best_practice_augmenter.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/llm/criteria_expander.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/llm/design_doc_extractor.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/llm/impl_step_deriver.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/llm/means_catalog_loader.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/llm/parser.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/llm/prompt_builder.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/llm/strategy_validator.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/llm/templates/best_practice_augment_meta.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/llm/templates/criteria_expand_meta.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/llm/templates/design_doc_extract_meta.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/llm/templates/impl_step_derive_meta.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/llm/templates/implementation_step_catalog.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/llm/templates/meta_instruction.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/llm/templates/plan_derive_meta.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/llm/templates/verification_means_catalog.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/mcp_server.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/measure.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/operational_e2e_audit.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/operations_derive.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/parsing/__init__.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/parsing/_shared.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/parsing/api_specs.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/parsing/filesystem_routes.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/parsing/iac.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/parsing/python_ast.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/parsing/schemas.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/parsing/tests_builddeps.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/parsing/treesitter.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/planner.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/policy.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/preflight/__init__.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/preflight/defaults/cli.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/preflight/defaults/generic.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/preflight/defaults/iot.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/preflight/defaults/mobile.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/preflight/defaults/web.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/project_types.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/propagate.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/propagation_common.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/propagator.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/reconciliation_ledger.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/registry.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/repair/__init__.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/repair/approval_repair.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/repair/auto_scope_guard.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/repair/engine.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/repair/git_patcher.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/repair/history.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/repair/llm_repair_engine.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/repair/loop.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/repair/primary_picker.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/repair/proof_breaks.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/repair/repair_result.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/repair/repairability_classifier.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/repair/schema.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/repair/templates/analyze_meta.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/repair/templates/propose_meta.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/repair/templates/repair_strategy_meta.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/repair/templates/repairability_meta.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/repair/test_failure_attribution.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/repair/verify_runner.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/repair_slice.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/require.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/require_plugins.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/require_propagate.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/required_artifacts/defaults/cli.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/required_artifacts/defaults/generic.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/required_artifacts/defaults/iot.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/required_artifacts/defaults/mobile.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/required_artifacts/defaults/web.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/required_artifacts_deriver.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/requirement_completeness/defaults/cli.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/requirement_completeness/defaults/generic.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/requirement_completeness/defaults/iot.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/requirement_completeness/defaults/mobile.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/requirement_completeness/defaults/web.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/requirement_completeness_auditor.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/requirement_reconciliation.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/requirements_meta.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/restoration_report.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/restore.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/routes_extractor.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/runtime_smoke/__init__.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/runtime_smoke/checks.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/runtime_smoke/config.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/runtime_smoke/report.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/runtime_smoke/runner.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/schema_refs.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/screen_flow_validator.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/screen_transition_extractor.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/screen_transitions/defaults.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/skills_cli/__init__.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/skills_cli/discovery.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/skills_cli/manager.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/skills_cli/paths.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/surface_reconciliation.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/synth.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/templates/codd.yaml.tmpl +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/templates/conventions.yaml.tmpl +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/templates/data_dependencies.yaml.tmpl +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/templates/doc_links.yaml.tmpl +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/templates/extract_ai_prompt_baseline.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/templates/extracted/api-contract.md.j2 +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/templates/extracted/architecture-overview.md.j2 +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/templates/extracted/module-detail.md.j2 +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/templates/extracted/schema-design.md.j2 +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/templates/extracted/system-context.md.j2 +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/templates/gitignore.tmpl +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/templates/lexicon_questions.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/templates/lexicon_schema.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/templates/overrides.yaml.tmpl +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/test_detection.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/test_import_coherence.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/traceability.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/validator.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/vb_marker_authenticity.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/vb_rerun_scope.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/verifiable_behavior_audit.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/watch/__init__.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/watch/events.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/watch/propagation_log.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/watch/propagation_pipeline.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/watch/test_runner.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/watch/watcher.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd/wiring.py +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ai_governance_eu_act/coverage_matrix.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ai_governance_eu_act/elicit_extend.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ai_governance_eu_act/lexicon.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ai_governance_eu_act/manifest.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ai_governance_eu_act/recommended_kinds.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ai_governance_eu_act/severity_rules.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/api_rate_limiting_caching/coverage_matrix.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/api_rate_limiting_caching/elicit_extend.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/api_rate_limiting_caching/lexicon.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/api_rate_limiting_caching/manifest.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/api_rate_limiting_caching/recommended_kinds.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/api_rate_limiting_caching/severity_rules.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/api_rest_openapi/coverage_matrix.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/api_rest_openapi/elicit_extend.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/api_rest_openapi/lexicon.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/api_rest_openapi/manifest.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/api_rest_openapi/recommended_kinds.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/api_rest_openapi/severity_rules.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/babok/elicit_extend.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/babok/lexicon.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/babok/manifest.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/babok/recommended_kinds.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/babok/severity_rules.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/backend_event_cloudevents/coverage_matrix.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/backend_event_cloudevents/elicit_extend.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/backend_event_cloudevents/lexicon.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/backend_event_cloudevents/manifest.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/backend_event_cloudevents/recommended_kinds.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/backend_event_cloudevents/severity_rules.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/backend_graphql/coverage_matrix.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/backend_graphql/elicit_extend.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/backend_graphql/lexicon.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/backend_graphql/manifest.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/backend_graphql/recommended_kinds.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/backend_graphql/severity_rules.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/backend_grpc_proto/coverage_matrix.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/backend_grpc_proto/elicit_extend.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/backend_grpc_proto/lexicon.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/backend_grpc_proto/manifest.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/backend_grpc_proto/recommended_kinds.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/backend_grpc_proto/severity_rules.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/compliance_hipaa/coverage_matrix.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/compliance_hipaa/elicit_extend.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/compliance_hipaa/lexicon.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/compliance_hipaa/manifest.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/compliance_hipaa/recommended_kinds.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/compliance_hipaa/severity_rules.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/compliance_iso27001/coverage_matrix.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/compliance_iso27001/elicit_extend.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/compliance_iso27001/lexicon.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/compliance_iso27001/manifest.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/compliance_iso27001/recommended_kinds.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/compliance_iso27001/severity_rules.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/compliance_pci_dss_4/coverage_matrix.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/compliance_pci_dss_4/elicit_extend.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/compliance_pci_dss_4/lexicon.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/compliance_pci_dss_4/manifest.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/compliance_pci_dss_4/recommended_kinds.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/compliance_pci_dss_4/severity_rules.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/data_aggregation_policies/coverage_matrix.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/data_aggregation_policies/elicit_extend.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/data_aggregation_policies/lexicon.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/data_aggregation_policies/manifest.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/data_aggregation_policies/recommended_kinds.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/data_aggregation_policies/severity_rules.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/coverage_matrix.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/elicit_extend.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/lexicon.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/manifest.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/recommended_kinds.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/severity_rules.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/data_governance_appi_gdpr/coverage_matrix.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/data_governance_appi_gdpr/elicit_extend.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/data_governance_appi_gdpr/lexicon.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/data_governance_appi_gdpr/manifest.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/data_governance_appi_gdpr/recommended_kinds.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/data_governance_appi_gdpr/severity_rules.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/data_nosql_jsonschema/coverage_matrix.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/data_nosql_jsonschema/elicit_extend.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/data_nosql_jsonschema/lexicon.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/data_nosql_jsonschema/manifest.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/data_nosql_jsonschema/recommended_kinds.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/data_nosql_jsonschema/severity_rules.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/data_relational_iso_sql/coverage_matrix.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/data_relational_iso_sql/elicit_extend.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/data_relational_iso_sql/lexicon.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/data_relational_iso_sql/manifest.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/data_relational_iso_sql/recommended_kinds.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/data_relational_iso_sql/severity_rules.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ddd_domain_driven_design/coverage_matrix.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ddd_domain_driven_design/elicit_extend.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ddd_domain_driven_design/lexicon.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ddd_domain_driven_design/manifest.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ddd_domain_driven_design/recommended_kinds.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ddd_domain_driven_design/severity_rules.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/dora_sre_metrics/coverage_matrix.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/dora_sre_metrics/elicit_extend.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/dora_sre_metrics/lexicon.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/dora_sre_metrics/manifest.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/dora_sre_metrics/recommended_kinds.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/dora_sre_metrics/severity_rules.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/i18n_unicode_cldr/coverage_matrix.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/i18n_unicode_cldr/elicit_extend.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/i18n_unicode_cldr/lexicon.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/i18n_unicode_cldr/manifest.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/i18n_unicode_cldr/recommended_kinds.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/i18n_unicode_cldr/severity_rules.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ml_model_cards/coverage_matrix.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ml_model_cards/elicit_extend.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ml_model_cards/lexicon.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ml_model_cards/manifest.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ml_model_cards/recommended_kinds.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ml_model_cards/severity_rules.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/mobile_a11y_native/coverage_matrix.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/mobile_a11y_native/elicit_extend.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/mobile_a11y_native/lexicon.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/mobile_a11y_native/manifest.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/mobile_a11y_native/recommended_kinds.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/mobile_a11y_native/severity_rules.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/mobile_android_material3/coverage_matrix.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/mobile_android_material3/elicit_extend.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/mobile_android_material3/lexicon.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/mobile_android_material3/manifest.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/mobile_android_material3/recommended_kinds.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/mobile_android_material3/severity_rules.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/mobile_ios_hig/coverage_matrix.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/mobile_ios_hig/elicit_extend.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/mobile_ios_hig/lexicon.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/mobile_ios_hig/manifest.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/mobile_ios_hig/recommended_kinds.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/mobile_ios_hig/severity_rules.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/mobile_security_masvs/coverage_matrix.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/mobile_security_masvs/elicit_extend.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/mobile_security_masvs/lexicon.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/mobile_security_masvs/manifest.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/mobile_security_masvs/recommended_kinds.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/mobile_security_masvs/severity_rules.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ops_cicd_pipeline/coverage_matrix.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ops_cicd_pipeline/elicit_extend.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ops_cicd_pipeline/lexicon.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ops_cicd_pipeline/manifest.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ops_cicd_pipeline/recommended_kinds.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ops_cicd_pipeline/severity_rules.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ops_iac_terraform/coverage_matrix.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ops_iac_terraform/elicit_extend.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ops_iac_terraform/lexicon.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ops_iac_terraform/manifest.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ops_iac_terraform/recommended_kinds.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ops_iac_terraform/severity_rules.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ops_kubernetes/coverage_matrix.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ops_kubernetes/elicit_extend.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ops_kubernetes/lexicon.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ops_kubernetes/manifest.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ops_kubernetes/recommended_kinds.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ops_kubernetes/severity_rules.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ops_observability_otel/coverage_matrix.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ops_observability_otel/elicit_extend.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ops_observability_otel/lexicon.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ops_observability_otel/manifest.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ops_observability_otel/recommended_kinds.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/ops_observability_otel/severity_rules.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/process_iso25010/coverage_matrix.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/process_iso25010/elicit_extend.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/process_iso25010/lexicon.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/process_iso25010/manifest.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/process_iso25010/recommended_kinds.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/process_iso25010/severity_rules.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/process_test_iso29119/coverage_matrix.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/process_test_iso29119/elicit_extend.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/process_test_iso29119/lexicon.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/process_test_iso29119/manifest.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/process_test_iso29119/recommended_kinds.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/process_test_iso29119/severity_rules.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/twelve_factor_app/coverage_matrix.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/twelve_factor_app/elicit_extend.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/twelve_factor_app/lexicon.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/twelve_factor_app/manifest.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/twelve_factor_app/recommended_kinds.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/twelve_factor_app/severity_rules.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/coverage_matrix.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/elicit_extend.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/lexicon.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/manifest.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/recommended_kinds.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/severity_rules.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_authn_webauthn/coverage_matrix.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_authn_webauthn/elicit_extend.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_authn_webauthn/lexicon.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_authn_webauthn/manifest.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_authn_webauthn/recommended_kinds.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_authn_webauthn/severity_rules.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_browser_compat/coverage_matrix.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_browser_compat/elicit_extend.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_browser_compat/lexicon.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_browser_compat/manifest.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_browser_compat/recommended_kinds.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_browser_compat/severity_rules.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_forms_html5/coverage_matrix.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_forms_html5/elicit_extend.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_forms_html5/lexicon.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_forms_html5/manifest.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_forms_html5/recommended_kinds.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_forms_html5/severity_rules.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_performance_core_web_vitals/coverage_matrix.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_performance_core_web_vitals/elicit_extend.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_performance_core_web_vitals/lexicon.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_performance_core_web_vitals/manifest.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_performance_core_web_vitals/recommended_kinds.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_performance_core_web_vitals/severity_rules.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_pwa_manifest/coverage_matrix.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_pwa_manifest/elicit_extend.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_pwa_manifest/lexicon.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_pwa_manifest/manifest.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_pwa_manifest/recommended_kinds.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_pwa_manifest/severity_rules.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_responsive/coverage_matrix.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_responsive/elicit_extend.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_responsive/lexicon.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_responsive/manifest.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_responsive/recommended_kinds.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_responsive/severity_rules.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_security_owasp/coverage_matrix.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_security_owasp/elicit_extend.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_security_owasp/lexicon.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_security_owasp/manifest.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_security_owasp/recommended_kinds.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_security_owasp/severity_rules.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_seo_schemaorg/coverage_matrix.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_seo_schemaorg/elicit_extend.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_seo_schemaorg/lexicon.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_seo_schemaorg/manifest.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_seo_schemaorg/recommended_kinds.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/lexicons/web_seo_schemaorg/severity_rules.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/codd_plugins/stack_map.yaml +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/docs/cookbook/cdp_browser/README.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/docs/cookbook/presentation_aggregation/README.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/docs/requirements/README.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/dogfood/README.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/dogfood/fixtures/flat_py_app/README.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/examples/README.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/skills/codd-assemble/SKILL.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/skills/codd-evolve/SKILL.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/skills/codd-generate/SKILL.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/skills/codd-greenfield/SKILL.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/skills/codd-impact/SKILL.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/skills/codd-init/SKILL.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/skills/codd-propagate/SKILL.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/skills/codd-restore/SKILL.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/skills/codd-scan/SKILL.md +0 -0
- {codd_dev-2.35.0 → codd_dev-2.36.0}/skills/codd-validate/SKILL.md +0 -0
- {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.
|
|
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
|
|
@@ -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
|
-
|
|
1280
|
-
|
|
1281
|
-
|
|
1282
|
-
|
|
1283
|
-
|
|
1284
|
-
|
|
1285
|
-
|
|
1286
|
-
|
|
1287
|
-
|
|
1288
|
-
|
|
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
|
-
|
|
1291
|
-
|
|
1292
|
-
|
|
1293
|
-
|
|
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
|
-
|
|
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
|
+
]
|