codd-dev 2.49.0__tar.gz → 2.51.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.49.0 → codd_dev-2.51.0}/PKG-INFO +1 -1
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/__init__.py +1 -1
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/generator.py +128 -17
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/greenfield/pipeline.py +192 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/vb_marker_authenticity.py +76 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/verifiable_behavior_audit.py +332 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/pyproject.toml +1 -1
- {codd_dev-2.49.0 → codd_dev-2.51.0}/.gitignore +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/LICENSE +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/README.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/bench_fixture/README.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/__main__.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/_git_helper.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/action_outcome.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/ai_invoke.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/ai_patch.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/artifact_contract.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/artifact_ids.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/artifacts/catalog.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/ask_user_question_adapter.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/assembler.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/bridge.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/brownfield/__init__.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/brownfield/pipeline.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/capability_completeness.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/claude_cli.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/cli.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/clustering.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/coherence_adapters.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/coherence_engine.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/confidence.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/config.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/config_schema.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/contracts.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/contracts_registry/__init__.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/contracts_registry/__main__.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/contracts_registry/certify.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/contracts_registry/generate_matrix.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/contracts_registry/registry.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/coverage_auditor.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/coverage_execution_coherence.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/coverage_metrics.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/dag/__init__.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/dag/auto_repair.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/dag/builder.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/dag/checks/__init__.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/dag/checks/_one_to_many_detection.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/dag/checks/artifact_contract_check.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/dag/checks/ci_health.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/dag/checks/dependency_freshness.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/dag/checks/depends_on_consistency.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/dag/checks/deployment_completeness.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/dag/checks/edge_validity.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/dag/checks/environment_coverage.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/dag/checks/implementation_coverage.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/dag/checks/node_completeness.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/dag/checks/opt_out.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/dag/checks/task_completion.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/dag/checks/transitive_closure.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/dag/checks/ui_coherence.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/dag/checks/user_journey_coherence.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/dag/coverage_axes.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/dag/defaults/cli.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/dag/defaults/cpp_embedded.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/dag/defaults/csharp.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/dag/defaults/elixir.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/dag/defaults/generic.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/dag/defaults/iot.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/dag/defaults/java.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/dag/defaults/kotlin.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/dag/defaults/mobile.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/dag/defaults/ruby.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/dag/defaults/rust.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/dag/defaults/scala.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/dag/defaults/swift.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/dag/defaults/test_frameworks.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/dag/defaults/web.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/dag/extractor.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/dag/impact.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/dag/runner.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/defaults.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/defaults.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/dependency_lock_coherence.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/deploy_targets/__init__.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/deploy_targets/app_service.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/deploy_targets/base.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/deploy_targets/docker_compose.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/deployer.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/deployment/__init__.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/deployment/checks/__init__.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/deployment/defaults/deploy_targets.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/deployment/defaults/runtime_capability_inference.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/deployment/defaults/schema_providers.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/deployment/defaults/verification_templates.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/deployment/extractor.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/deployment/providers/__init__.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/deployment/providers/ai_command.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/deployment/providers/ai_command_factory.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/deployment/providers/codex_app_server.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/deployment/providers/llm_consideration.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/deployment/providers/schema/__init__.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/deployment/providers/schema/prisma.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/deployment/providers/target/__init__.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/deployment/providers/target/docker_compose.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/deployment/providers/verification/__init__.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/deployment/providers/verification/assertion_handlers.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/deployment/providers/verification/cdp_browser.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/deployment/providers/verification/cdp_engines.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/deployment/providers/verification/cdp_launchers.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/deployment/providers/verification/cdp_wire.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/deployment/providers/verification/curl.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/deployment/providers/verification/form_strategies.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/deployment/providers/verification/means_catalog.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/deployment/providers/verification/playwright.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/deployment/providers/verification/pytest_http.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/deployment/providers/verification/vitest.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/design_md.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/diff/__init__.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/diff/apply.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/diff/engine.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/diff/persistence.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/diff/templates/diff_prompt.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/discovery.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/drift.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/e2e_contract_coherence.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/e2e_extractor.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/e2e_generator.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/e2e_harness.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/e2e_runner.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/elicit/__init__.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/elicit/apply.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/elicit/engine.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/elicit/finding.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/elicit/formatters/__init__.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/elicit/formatters/base.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/elicit/formatters/interactive.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/elicit/formatters/json_fmt.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/elicit/formatters/md.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/elicit/lexicon_loader.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/elicit/persistence.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/elicit/templates/elicit_prompt_L0.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/env_refs.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/extract_ai.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/extract_paths.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/extractor.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/fix/__init__.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/fix/candidate_selector.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/fix/design_updater.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/fix/impl_propagation.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/fix/interactive_prompt.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/fix/phenomenon_fixer.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/fix/phenomenon_parser.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/fix/risk_classifier.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/fix/templates/clarification_question.txt +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/fix/templates/design_update.txt +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/fix/templates/impl_update.txt +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/fix/templates/phenomenon_parse.txt +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/fix/templates/risk_assessment.txt +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/fix/templates_loader.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/fixer.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/fixup_drift.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/fixup_drift_strategies/__init__.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/fixup_drift_strategies/design_token_drift.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/fixup_drift_strategies/lexicon_violation.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/fixup_drift_strategies/url_drift.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/frontmatter.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/git_evidence.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/graph.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/greenfield/__init__.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/hitl_session.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/hooks/__init__.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/hooks/pre-commit +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/hooks/recipes/claude_requirements_nudge.json +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/hooks/recipes/claude_settings_example.json +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/hooks/recipes/codex_hook.sh +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/hooks/recipes/git_post_commit.sh +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/hooks/recipes/git_pre_commit.sh +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/iac_nfr.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/implement_oracle.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/implement_oracle_scope.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/implementer/__init__.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/implementer/chunked_runner.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/implementer/typecheck_loop.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/implementer.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/import_coherence.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/inheritance.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/init/__init__.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/init/lexicon_suggest.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/init/llm_lexicon_suggester.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/init/stack_detector.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/knowledge_fetcher.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/lexicon.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/lexicon_cli/__init__.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/lexicon_cli/formatters/__init__.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/lexicon_cli/formatters/html.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/lexicon_cli/formatters/json_fmt.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/lexicon_cli/formatters/md.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/lexicon_cli/inspector.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/lexicon_cli/manager.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/lexicon_cli/reporter.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/lexicon_cli/threshold.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/llm/__init__.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/llm/approval.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/llm/best_practice_augmenter.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/llm/criteria_expander.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/llm/design_doc_extractor.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/llm/impl_step_deriver.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/llm/means_catalog_loader.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/llm/parser.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/llm/plan_deriver.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/llm/prompt_builder.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/llm/strategy_validator.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/llm/templates/best_practice_augment_meta.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/llm/templates/criteria_expand_meta.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/llm/templates/design_doc_extract_meta.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/llm/templates/impl_step_derive_meta.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/llm/templates/implementation_step_catalog.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/llm/templates/meta_instruction.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/llm/templates/plan_derive_meta.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/llm/templates/verification_means_catalog.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/mcp_server.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/measure.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/operational_e2e_audit.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/operations_derive.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/parsing/__init__.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/parsing/_shared.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/parsing/api_specs.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/parsing/filesystem_routes.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/parsing/iac.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/parsing/python_ast.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/parsing/schemas.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/parsing/tests_builddeps.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/parsing/treesitter.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/planner.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/policy.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/preflight/__init__.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/preflight/defaults/cli.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/preflight/defaults/generic.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/preflight/defaults/iot.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/preflight/defaults/mobile.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/preflight/defaults/web.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/project_types.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/propagate.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/propagation_common.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/propagator.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/reconciliation_ledger.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/reference_resolution.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/registry.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/repair/__init__.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/repair/approval_repair.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/repair/auto_scope_guard.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/repair/engine.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/repair/git_patcher.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/repair/history.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/repair/llm_repair_engine.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/repair/loop.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/repair/primary_picker.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/repair/proof_breaks.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/repair/repair_result.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/repair/repairability_classifier.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/repair/schema.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/repair/templates/analyze_meta.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/repair/templates/propose_meta.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/repair/templates/repair_strategy_meta.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/repair/templates/repairability_meta.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/repair/test_failure_attribution.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/repair/verify_runner.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/repair_slice.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/require.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/require_plugins.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/require_propagate.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/required_artifacts/defaults/cli.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/required_artifacts/defaults/generic.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/required_artifacts/defaults/iot.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/required_artifacts/defaults/mobile.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/required_artifacts/defaults/web.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/required_artifacts_deriver.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/requirement_completeness/defaults/cli.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/requirement_completeness/defaults/generic.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/requirement_completeness/defaults/iot.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/requirement_completeness/defaults/mobile.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/requirement_completeness/defaults/web.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/requirement_completeness_auditor.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/requirement_reconciliation.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/requirements_meta.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/restoration_report.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/restore.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/routes_extractor.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/runtime_smoke/__init__.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/runtime_smoke/checks.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/runtime_smoke/config.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/runtime_smoke/report.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/runtime_smoke/runner.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/scanner.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/schema_refs.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/screen_flow_validator.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/screen_transition_extractor.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/screen_transitions/defaults.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/skills_cli/__init__.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/skills_cli/discovery.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/skills_cli/manager.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/skills_cli/paths.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/surface_reconciliation.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/synth.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/templates/codd.yaml.tmpl +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/templates/conventions.yaml.tmpl +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/templates/data_dependencies.yaml.tmpl +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/templates/doc_links.yaml.tmpl +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/templates/extract_ai_prompt_baseline.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/templates/extracted/api-contract.md.j2 +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/templates/extracted/architecture-overview.md.j2 +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/templates/extracted/module-detail.md.j2 +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/templates/extracted/schema-design.md.j2 +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/templates/extracted/system-context.md.j2 +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/templates/gitignore.tmpl +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/templates/lexicon_questions.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/templates/lexicon_schema.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/templates/overrides.yaml.tmpl +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/test_detection.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/test_import_coherence.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/traceability.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/validator.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/vb_rerun_scope.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/watch/__init__.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/watch/events.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/watch/propagation_log.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/watch/propagation_pipeline.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/watch/test_runner.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/watch/watcher.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd/wiring.py +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/ai_governance_eu_act/coverage_matrix.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/ai_governance_eu_act/elicit_extend.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/ai_governance_eu_act/lexicon.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/ai_governance_eu_act/manifest.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/ai_governance_eu_act/recommended_kinds.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/ai_governance_eu_act/severity_rules.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/api_rate_limiting_caching/coverage_matrix.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/api_rate_limiting_caching/elicit_extend.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/api_rate_limiting_caching/lexicon.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/api_rate_limiting_caching/manifest.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/api_rate_limiting_caching/recommended_kinds.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/api_rate_limiting_caching/severity_rules.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/api_rest_openapi/coverage_matrix.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/api_rest_openapi/elicit_extend.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/api_rest_openapi/lexicon.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/api_rest_openapi/manifest.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/api_rest_openapi/recommended_kinds.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/api_rest_openapi/severity_rules.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/babok/elicit_extend.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/babok/lexicon.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/babok/manifest.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/babok/recommended_kinds.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/babok/severity_rules.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/backend_event_cloudevents/coverage_matrix.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/backend_event_cloudevents/elicit_extend.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/backend_event_cloudevents/lexicon.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/backend_event_cloudevents/manifest.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/backend_event_cloudevents/recommended_kinds.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/backend_event_cloudevents/severity_rules.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/backend_graphql/coverage_matrix.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/backend_graphql/elicit_extend.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/backend_graphql/lexicon.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/backend_graphql/manifest.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/backend_graphql/recommended_kinds.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/backend_graphql/severity_rules.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/backend_grpc_proto/coverage_matrix.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/backend_grpc_proto/elicit_extend.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/backend_grpc_proto/lexicon.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/backend_grpc_proto/manifest.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/backend_grpc_proto/recommended_kinds.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/backend_grpc_proto/severity_rules.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/compliance_hipaa/coverage_matrix.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/compliance_hipaa/elicit_extend.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/compliance_hipaa/lexicon.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/compliance_hipaa/manifest.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/compliance_hipaa/recommended_kinds.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/compliance_hipaa/severity_rules.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/compliance_iso27001/coverage_matrix.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/compliance_iso27001/elicit_extend.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/compliance_iso27001/lexicon.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/compliance_iso27001/manifest.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/compliance_iso27001/recommended_kinds.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/compliance_iso27001/severity_rules.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/compliance_pci_dss_4/coverage_matrix.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/compliance_pci_dss_4/elicit_extend.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/compliance_pci_dss_4/lexicon.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/compliance_pci_dss_4/manifest.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/compliance_pci_dss_4/recommended_kinds.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/compliance_pci_dss_4/severity_rules.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/data_aggregation_policies/coverage_matrix.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/data_aggregation_policies/elicit_extend.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/data_aggregation_policies/lexicon.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/data_aggregation_policies/manifest.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/data_aggregation_policies/recommended_kinds.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/data_aggregation_policies/severity_rules.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/coverage_matrix.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/elicit_extend.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/lexicon.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/manifest.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/recommended_kinds.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/severity_rules.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/data_governance_appi_gdpr/coverage_matrix.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/data_governance_appi_gdpr/elicit_extend.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/data_governance_appi_gdpr/lexicon.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/data_governance_appi_gdpr/manifest.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/data_governance_appi_gdpr/recommended_kinds.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/data_governance_appi_gdpr/severity_rules.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/data_nosql_jsonschema/coverage_matrix.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/data_nosql_jsonschema/elicit_extend.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/data_nosql_jsonschema/lexicon.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/data_nosql_jsonschema/manifest.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/data_nosql_jsonschema/recommended_kinds.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/data_nosql_jsonschema/severity_rules.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/data_relational_iso_sql/coverage_matrix.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/data_relational_iso_sql/elicit_extend.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/data_relational_iso_sql/lexicon.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/data_relational_iso_sql/manifest.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/data_relational_iso_sql/recommended_kinds.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/data_relational_iso_sql/severity_rules.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/ddd_domain_driven_design/coverage_matrix.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/ddd_domain_driven_design/elicit_extend.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/ddd_domain_driven_design/lexicon.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/ddd_domain_driven_design/manifest.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/ddd_domain_driven_design/recommended_kinds.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/ddd_domain_driven_design/severity_rules.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/dora_sre_metrics/coverage_matrix.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/dora_sre_metrics/elicit_extend.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/dora_sre_metrics/lexicon.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/dora_sre_metrics/manifest.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/dora_sre_metrics/recommended_kinds.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/dora_sre_metrics/severity_rules.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/i18n_unicode_cldr/coverage_matrix.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/i18n_unicode_cldr/elicit_extend.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/i18n_unicode_cldr/lexicon.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/i18n_unicode_cldr/manifest.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/i18n_unicode_cldr/recommended_kinds.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/i18n_unicode_cldr/severity_rules.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/ml_model_cards/coverage_matrix.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/ml_model_cards/elicit_extend.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/ml_model_cards/lexicon.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/ml_model_cards/manifest.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/ml_model_cards/recommended_kinds.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/ml_model_cards/severity_rules.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/mobile_a11y_native/coverage_matrix.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/mobile_a11y_native/elicit_extend.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/mobile_a11y_native/lexicon.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/mobile_a11y_native/manifest.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/mobile_a11y_native/recommended_kinds.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/mobile_a11y_native/severity_rules.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/mobile_android_material3/coverage_matrix.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/mobile_android_material3/elicit_extend.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/mobile_android_material3/lexicon.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/mobile_android_material3/manifest.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/mobile_android_material3/recommended_kinds.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/mobile_android_material3/severity_rules.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/mobile_ios_hig/coverage_matrix.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/mobile_ios_hig/elicit_extend.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/mobile_ios_hig/lexicon.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/mobile_ios_hig/manifest.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/mobile_ios_hig/recommended_kinds.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/mobile_ios_hig/severity_rules.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/mobile_security_masvs/coverage_matrix.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/mobile_security_masvs/elicit_extend.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/mobile_security_masvs/lexicon.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/mobile_security_masvs/manifest.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/mobile_security_masvs/recommended_kinds.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/mobile_security_masvs/severity_rules.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/ops_cicd_pipeline/coverage_matrix.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/ops_cicd_pipeline/elicit_extend.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/ops_cicd_pipeline/lexicon.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/ops_cicd_pipeline/manifest.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/ops_cicd_pipeline/recommended_kinds.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/ops_cicd_pipeline/severity_rules.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/ops_iac_terraform/coverage_matrix.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/ops_iac_terraform/elicit_extend.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/ops_iac_terraform/lexicon.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/ops_iac_terraform/manifest.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/ops_iac_terraform/recommended_kinds.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/ops_iac_terraform/severity_rules.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/ops_kubernetes/coverage_matrix.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/ops_kubernetes/elicit_extend.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/ops_kubernetes/lexicon.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/ops_kubernetes/manifest.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/ops_kubernetes/recommended_kinds.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/ops_kubernetes/severity_rules.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/ops_observability_otel/coverage_matrix.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/ops_observability_otel/elicit_extend.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/ops_observability_otel/lexicon.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/ops_observability_otel/manifest.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/ops_observability_otel/recommended_kinds.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/ops_observability_otel/severity_rules.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/process_iso25010/coverage_matrix.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/process_iso25010/elicit_extend.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/process_iso25010/lexicon.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/process_iso25010/manifest.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/process_iso25010/recommended_kinds.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/process_iso25010/severity_rules.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/process_test_iso29119/coverage_matrix.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/process_test_iso29119/elicit_extend.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/process_test_iso29119/lexicon.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/process_test_iso29119/manifest.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/process_test_iso29119/recommended_kinds.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/process_test_iso29119/severity_rules.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/twelve_factor_app/coverage_matrix.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/twelve_factor_app/elicit_extend.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/twelve_factor_app/lexicon.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/twelve_factor_app/manifest.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/twelve_factor_app/recommended_kinds.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/twelve_factor_app/severity_rules.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/coverage_matrix.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/elicit_extend.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/lexicon.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/manifest.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/recommended_kinds.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/severity_rules.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/web_authn_webauthn/coverage_matrix.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/web_authn_webauthn/elicit_extend.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/web_authn_webauthn/lexicon.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/web_authn_webauthn/manifest.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/web_authn_webauthn/recommended_kinds.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/web_authn_webauthn/severity_rules.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/web_browser_compat/coverage_matrix.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/web_browser_compat/elicit_extend.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/web_browser_compat/lexicon.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/web_browser_compat/manifest.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/web_browser_compat/recommended_kinds.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/web_browser_compat/severity_rules.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/web_forms_html5/coverage_matrix.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/web_forms_html5/elicit_extend.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/web_forms_html5/lexicon.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/web_forms_html5/manifest.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/web_forms_html5/recommended_kinds.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/web_forms_html5/severity_rules.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/web_performance_core_web_vitals/coverage_matrix.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/web_performance_core_web_vitals/elicit_extend.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/web_performance_core_web_vitals/lexicon.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/web_performance_core_web_vitals/manifest.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/web_performance_core_web_vitals/recommended_kinds.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/web_performance_core_web_vitals/severity_rules.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/web_pwa_manifest/coverage_matrix.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/web_pwa_manifest/elicit_extend.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/web_pwa_manifest/lexicon.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/web_pwa_manifest/manifest.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/web_pwa_manifest/recommended_kinds.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/web_pwa_manifest/severity_rules.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/web_responsive/coverage_matrix.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/web_responsive/elicit_extend.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/web_responsive/lexicon.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/web_responsive/manifest.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/web_responsive/recommended_kinds.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/web_responsive/severity_rules.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/web_security_owasp/coverage_matrix.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/web_security_owasp/elicit_extend.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/web_security_owasp/lexicon.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/web_security_owasp/manifest.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/web_security_owasp/recommended_kinds.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/web_security_owasp/severity_rules.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/web_seo_schemaorg/coverage_matrix.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/web_seo_schemaorg/elicit_extend.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/web_seo_schemaorg/lexicon.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/web_seo_schemaorg/manifest.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/web_seo_schemaorg/recommended_kinds.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/lexicons/web_seo_schemaorg/severity_rules.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/codd_plugins/stack_map.yaml +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/docs/cookbook/cdp_browser/README.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/docs/cookbook/presentation_aggregation/README.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/docs/requirements/README.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/dogfood/README.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/dogfood/fixtures/flat_py_app/README.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/examples/README.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/skills/codd-assemble/SKILL.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/skills/codd-evolve/SKILL.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/skills/codd-generate/SKILL.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/skills/codd-greenfield/SKILL.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/skills/codd-impact/SKILL.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/skills/codd-init/SKILL.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/skills/codd-propagate/SKILL.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/skills/codd-restore/SKILL.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/skills/codd-scan/SKILL.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.0}/skills/codd-validate/SKILL.md +0 -0
- {codd_dev-2.49.0 → codd_dev-2.51.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.51.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
|
|
@@ -607,33 +607,144 @@ def generate_wave(
|
|
|
607
607
|
if output_path.exists() and not force:
|
|
608
608
|
results.append(GenerationResult(node_id=artifact.node_id, path=output_path, status="skipped"))
|
|
609
609
|
continue
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
output_path.parent.mkdir(parents=True, exist_ok=True)
|
|
613
|
-
combined_conventions = deepcopy(global_conventions) + deepcopy(artifact.conventions)
|
|
614
|
-
content = _render_document(
|
|
615
|
-
artifact=artifact,
|
|
616
|
-
global_conventions=global_conventions,
|
|
617
|
-
depended_by=depended_by_map.get(artifact.node_id, []),
|
|
618
|
-
body=_generate_document_body(
|
|
610
|
+
results.append(
|
|
611
|
+
_generate_one_artifact(
|
|
619
612
|
artifact=artifact,
|
|
620
|
-
dependency_documents=dependency_documents,
|
|
621
|
-
conventions=combined_conventions,
|
|
622
|
-
ai_command=resolved_ai_command,
|
|
623
613
|
project_root=project_root,
|
|
624
|
-
|
|
625
|
-
|
|
614
|
+
global_conventions=global_conventions,
|
|
615
|
+
depended_by_map=depended_by_map,
|
|
616
|
+
document_node_paths=document_node_paths,
|
|
617
|
+
resolved_ai_command=resolved_ai_command,
|
|
618
|
+
body_max_retries=body_max_retries,
|
|
626
619
|
capabilities=capabilities,
|
|
627
620
|
project_language=project_language,
|
|
628
|
-
|
|
621
|
+
feedback=feedback,
|
|
622
|
+
)
|
|
629
623
|
)
|
|
630
|
-
output_path.write_text(content, encoding="utf-8")
|
|
631
|
-
results.append(GenerationResult(node_id=artifact.node_id, path=output_path, status="generated"))
|
|
632
624
|
|
|
633
625
|
_enforce_vb_declaration_coherence(project_root, config, results)
|
|
634
626
|
return results
|
|
635
627
|
|
|
636
628
|
|
|
629
|
+
def _generate_one_artifact(
|
|
630
|
+
*,
|
|
631
|
+
artifact: WaveArtifact,
|
|
632
|
+
project_root: Path,
|
|
633
|
+
global_conventions: list[dict[str, Any]],
|
|
634
|
+
depended_by_map: dict[str, list[dict[str, Any]]],
|
|
635
|
+
document_node_paths: dict[str, Path],
|
|
636
|
+
resolved_ai_command: str,
|
|
637
|
+
body_max_retries: int,
|
|
638
|
+
capabilities: "ProjectCapabilities | None",
|
|
639
|
+
project_language: str | None,
|
|
640
|
+
feedback: str | None,
|
|
641
|
+
) -> GenerationResult:
|
|
642
|
+
"""Render ONE artifact's document and write it (overwriting any prior file).
|
|
643
|
+
|
|
644
|
+
The shared per-artifact rendering step used by both :func:`generate_wave`
|
|
645
|
+
(the wave loop) and :func:`regenerate_artifact` (the single-doc repair seam).
|
|
646
|
+
Always (re)writes the output; skip-if-exists is the wave loop's decision, not
|
|
647
|
+
this helper's, so a scoped repair can overwrite exactly one doc.
|
|
648
|
+
"""
|
|
649
|
+
|
|
650
|
+
output_path = project_root / artifact.output
|
|
651
|
+
dependency_documents = _load_dependency_documents(
|
|
652
|
+
project_root, artifact.depends_on, document_node_paths
|
|
653
|
+
)
|
|
654
|
+
output_path.parent.mkdir(parents=True, exist_ok=True)
|
|
655
|
+
combined_conventions = deepcopy(global_conventions) + deepcopy(artifact.conventions)
|
|
656
|
+
content = _render_document(
|
|
657
|
+
artifact=artifact,
|
|
658
|
+
global_conventions=global_conventions,
|
|
659
|
+
depended_by=depended_by_map.get(artifact.node_id, []),
|
|
660
|
+
body=_generate_document_body(
|
|
661
|
+
artifact=artifact,
|
|
662
|
+
dependency_documents=dependency_documents,
|
|
663
|
+
conventions=combined_conventions,
|
|
664
|
+
ai_command=resolved_ai_command,
|
|
665
|
+
project_root=project_root,
|
|
666
|
+
feedback=feedback,
|
|
667
|
+
max_retries=body_max_retries,
|
|
668
|
+
capabilities=capabilities,
|
|
669
|
+
project_language=project_language,
|
|
670
|
+
),
|
|
671
|
+
)
|
|
672
|
+
output_path.write_text(content, encoding="utf-8")
|
|
673
|
+
return GenerationResult(node_id=artifact.node_id, path=output_path, status="generated")
|
|
674
|
+
|
|
675
|
+
|
|
676
|
+
def regenerate_artifact(
|
|
677
|
+
project_root: Path,
|
|
678
|
+
*,
|
|
679
|
+
node_id: str | None = None,
|
|
680
|
+
output_path: str | None = None,
|
|
681
|
+
feedback: str | None = None,
|
|
682
|
+
ai_command: str | None = None,
|
|
683
|
+
) -> GenerationResult:
|
|
684
|
+
"""Regenerate a SINGLE wave artifact in place, scoped to one document.
|
|
685
|
+
|
|
686
|
+
The thin seam the greenfield generate-time VB-registry repair uses: it
|
|
687
|
+
rewrites ONLY the canonical VB doc (``docs/test/test_strategy.md``) with
|
|
688
|
+
repair feedback, WITHOUT re-running the whole wave (which would clobber the
|
|
689
|
+
sibling governance/design docs already generated). Reuses the exact wave
|
|
690
|
+
plumbing (:func:`_generate_one_artifact` → ``_load_dependency_documents`` /
|
|
691
|
+
``_render_document`` / ``_generate_document_body``); only the artifact
|
|
692
|
+
selection (by ``node_id`` or ``output``) and the forced overwrite differ.
|
|
693
|
+
|
|
694
|
+
Identify the target by ``node_id`` (preferred) or ``output_path`` (the
|
|
695
|
+
artifact's ``output``). Raises ``ValueError`` if no/!=1 wave artifact matches
|
|
696
|
+
— an ambiguous or absent target must fail loudly, never silently no-op.
|
|
697
|
+
"""
|
|
698
|
+
|
|
699
|
+
from codd.scanner import build_document_node_path_map
|
|
700
|
+
|
|
701
|
+
if not node_id and not output_path:
|
|
702
|
+
raise ValueError("regenerate_artifact requires node_id or output_path")
|
|
703
|
+
|
|
704
|
+
config = _load_project_config(project_root)
|
|
705
|
+
artifacts = _load_wave_artifacts(config)
|
|
706
|
+
|
|
707
|
+
def _matches(candidate: WaveArtifact) -> bool:
|
|
708
|
+
if node_id is not None and candidate.node_id == node_id:
|
|
709
|
+
return True
|
|
710
|
+
if output_path is not None:
|
|
711
|
+
want = output_path.replace("\\", "/").strip("/")
|
|
712
|
+
have = str(candidate.output).replace("\\", "/").strip("/")
|
|
713
|
+
if want == have:
|
|
714
|
+
return True
|
|
715
|
+
return False
|
|
716
|
+
|
|
717
|
+
matched = [artifact for artifact in artifacts if _matches(artifact)]
|
|
718
|
+
if not matched:
|
|
719
|
+
target = node_id or output_path
|
|
720
|
+
raise ValueError(f"wave_config has no artifact matching {target!r}")
|
|
721
|
+
if len(matched) > 1:
|
|
722
|
+
target = node_id or output_path
|
|
723
|
+
raise ValueError(f"wave_config has {len(matched)} artifacts matching {target!r}; ambiguous")
|
|
724
|
+
|
|
725
|
+
artifact = matched[0]
|
|
726
|
+
resolved_ai_command = _resolve_ai_command(config, ai_command, command_name="generate")
|
|
727
|
+
global_conventions = _normalize_conventions(config.get("conventions", []))
|
|
728
|
+
depended_by_map = _build_depended_by_map(artifacts)
|
|
729
|
+
document_node_paths = build_document_node_path_map(project_root, config)
|
|
730
|
+
body_max_retries = _body_max_retries(config)
|
|
731
|
+
capabilities = _resolve_generation_capabilities(config, project_root)
|
|
732
|
+
project_language = _resolve_project_language(config)
|
|
733
|
+
|
|
734
|
+
return _generate_one_artifact(
|
|
735
|
+
artifact=artifact,
|
|
736
|
+
project_root=project_root,
|
|
737
|
+
global_conventions=global_conventions,
|
|
738
|
+
depended_by_map=depended_by_map,
|
|
739
|
+
document_node_paths=document_node_paths,
|
|
740
|
+
resolved_ai_command=resolved_ai_command,
|
|
741
|
+
body_max_retries=body_max_retries,
|
|
742
|
+
capabilities=capabilities,
|
|
743
|
+
project_language=project_language,
|
|
744
|
+
feedback=feedback,
|
|
745
|
+
)
|
|
746
|
+
|
|
747
|
+
|
|
637
748
|
def _enforce_vb_declaration_coherence(
|
|
638
749
|
project_root: Path,
|
|
639
750
|
config: dict[str, Any],
|
|
@@ -657,8 +657,181 @@ class GreenfieldPipeline:
|
|
|
657
657
|
record["units"][key] = STATUS_DONE
|
|
658
658
|
self._checkpoint(project_root)
|
|
659
659
|
self.echo(f"[greenfield] generate wave {wave}: {detail}")
|
|
660
|
+
|
|
661
|
+
# After ALL waves are generated, enforce the canonical VB-registry
|
|
662
|
+
# completeness contract (model-independence): a weak model can reference
|
|
663
|
+
# VB ids in acceptance-criteria tables yet declare none in the canonical
|
|
664
|
+
# registry, which honest-REDs only later at implement with a confusing
|
|
665
|
+
# orphan message. Catch it HERE and drive a bounded, canonical-doc-scoped
|
|
666
|
+
# repair so a coherent registry exists before implement — or fail
|
|
667
|
+
# honestly at generate. Runs BEFORE implement by construction.
|
|
668
|
+
self._enforce_generate_vb_registry_gate(project_root, options)
|
|
660
669
|
record["detail"] = f"{len(waves)} wave(s) generated"
|
|
661
670
|
|
|
671
|
+
def _enforce_generate_vb_registry_gate(
|
|
672
|
+
self, project_root: Path, options: dict[str, Any]
|
|
673
|
+
) -> None:
|
|
674
|
+
"""Generate-time canonical VB-registry completeness gate + bounded repair.
|
|
675
|
+
|
|
676
|
+
Adopts the GPT design (B as contract + A as bounded generate repair). On
|
|
677
|
+
error-level :func:`validate_vb_registry_completeness` issues (empty
|
|
678
|
+
canonical registry / unresolved AC references / missing canonical doc),
|
|
679
|
+
re-invoke generation SCOPED TO the canonical VB doc only
|
|
680
|
+
(:func:`codd.generator.regenerate_artifact`) with repair feedback, then
|
|
681
|
+
re-validate. After the bounded attempts (1–2), a still-failing registry
|
|
682
|
+
raises :class:`StageError` (generate honest-RED).
|
|
683
|
+
|
|
684
|
+
The MODEL writes the declarations — this is NOT deterministic auto-derive.
|
|
685
|
+
Acceptance-criteria references are used ONLY as the candidate list in the
|
|
686
|
+
repair feedback, NEVER auto-inserted into the canonical table (rejecting
|
|
687
|
+
design option C). Skipped for a project with no verifiable-behavior
|
|
688
|
+
surface (:func:`project_expects_vb_registry`) and when the owner turned
|
|
689
|
+
the coverage gate off — the registry contract tracks the coverage gate.
|
|
690
|
+
"""
|
|
691
|
+
from codd.config import load_project_config
|
|
692
|
+
from codd.verifiable_behavior_audit import (
|
|
693
|
+
_CANONICAL_VB_OUTPUT_PATH,
|
|
694
|
+
coverage_gate_enabled,
|
|
695
|
+
project_expects_vb_registry,
|
|
696
|
+
validate_vb_registry_completeness,
|
|
697
|
+
)
|
|
698
|
+
|
|
699
|
+
if not bool(options.get("coverage_gate", True)):
|
|
700
|
+
return
|
|
701
|
+
try:
|
|
702
|
+
config = load_project_config(project_root)
|
|
703
|
+
except (FileNotFoundError, ValueError):
|
|
704
|
+
config = {}
|
|
705
|
+
if not coverage_gate_enabled(config):
|
|
706
|
+
return
|
|
707
|
+
if not project_expects_vb_registry(project_root, config):
|
|
708
|
+
# No VB surface planned/declared — nothing to certify. Mirrors the
|
|
709
|
+
# brownfield "nothing to audit -> pass" rule; a minimal greenfield
|
|
710
|
+
# project with only design docs is not forced to invent behaviors.
|
|
711
|
+
return
|
|
712
|
+
|
|
713
|
+
max_attempts = max(1, int(self._option_overrides.get("max_repair_attempts") or 0) or 2)
|
|
714
|
+
max_attempts = min(max_attempts, 2) # bounded: 1–2 attempts (design)
|
|
715
|
+
|
|
716
|
+
# Reference the seam through the module (not a bound name) so a test's
|
|
717
|
+
# monkeypatch on ``codd.generator.regenerate_artifact`` is honored.
|
|
718
|
+
from codd import generator as generator_module
|
|
719
|
+
|
|
720
|
+
issues = validate_vb_registry_completeness(project_root, config, strict=True)
|
|
721
|
+
errors = [issue for issue in issues if issue.severity == "error"]
|
|
722
|
+
attempt = 0
|
|
723
|
+
while errors and attempt < max_attempts:
|
|
724
|
+
attempt += 1
|
|
725
|
+
feedback = self._build_vb_registry_repair_feedback(project_root, config, errors)
|
|
726
|
+
self.echo(
|
|
727
|
+
f"[greenfield] generate VB-registry gate: {len(errors)} issue(s); "
|
|
728
|
+
f"re-generating {_CANONICAL_VB_OUTPUT_PATH} with repair feedback "
|
|
729
|
+
f"(attempt {attempt}/{max_attempts})"
|
|
730
|
+
)
|
|
731
|
+
try:
|
|
732
|
+
generator_module.regenerate_artifact(
|
|
733
|
+
project_root,
|
|
734
|
+
output_path=_CANONICAL_VB_OUTPUT_PATH,
|
|
735
|
+
feedback=feedback,
|
|
736
|
+
ai_command=self.ai_command,
|
|
737
|
+
)
|
|
738
|
+
except (FileNotFoundError, ValueError) as exc:
|
|
739
|
+
# The canonical doc is not a planned artifact, or regeneration
|
|
740
|
+
# failed — cannot repair. Fail honestly with the original gap.
|
|
741
|
+
raise StageError(
|
|
742
|
+
f"generate VB-registry gate: canonical registry repair could not run "
|
|
743
|
+
f"({exc}); the canonical VB document ({_CANONICAL_VB_OUTPUT_PATH}) must "
|
|
744
|
+
"declare every verifiable behavior as a first-column VB-* row."
|
|
745
|
+
) from exc
|
|
746
|
+
issues = validate_vb_registry_completeness(project_root, config, strict=True)
|
|
747
|
+
errors = [issue for issue in issues if issue.severity == "error"]
|
|
748
|
+
|
|
749
|
+
if errors:
|
|
750
|
+
detail = "\n".join(f" - {issue.message}" for issue in errors)
|
|
751
|
+
raise StageError(
|
|
752
|
+
"generate VB-registry gate FAILED: the generated canonical verifiable-behavior "
|
|
753
|
+
f"registry ({_CANONICAL_VB_OUTPUT_PATH}) is still incomplete after "
|
|
754
|
+
f"{attempt} repair attempt(s):\n{detail}\n"
|
|
755
|
+
"Declare every real verifiable behavior exactly once as a first-column VB-* row "
|
|
756
|
+
"in the canonical doc so coverage/authenticity can certify the system."
|
|
757
|
+
)
|
|
758
|
+
if attempt:
|
|
759
|
+
self.echo(
|
|
760
|
+
f"[greenfield] generate VB-registry gate: canonical registry repaired "
|
|
761
|
+
f"after {attempt} attempt(s) — OK"
|
|
762
|
+
)
|
|
763
|
+
|
|
764
|
+
def _build_vb_registry_repair_feedback(
|
|
765
|
+
self, project_root: Path, config: dict[str, Any], errors: list[Any]
|
|
766
|
+
) -> str:
|
|
767
|
+
"""Repair feedback for the canonical-doc-scoped regeneration.
|
|
768
|
+
|
|
769
|
+
Lists the canonical-registry declaration count + the unresolved AC
|
|
770
|
+
references (the CANDIDATE id list, never auto-inserted) + the repair
|
|
771
|
+
rules in the shape the GPT design specified. The references are a hint
|
|
772
|
+
about which behaviors likely exist — the model decides which correspond
|
|
773
|
+
to real behaviors and declares them; nothing is derived deterministically.
|
|
774
|
+
"""
|
|
775
|
+
from codd.verifiable_behavior_audit import (
|
|
776
|
+
_CANONICAL_VB_OUTPUT_PATH,
|
|
777
|
+
_config_without_doc_pin,
|
|
778
|
+
_iter_doc_texts,
|
|
779
|
+
_normalize_vb_id,
|
|
780
|
+
is_canonical_vb_doc,
|
|
781
|
+
parse_vb_references,
|
|
782
|
+
parse_vb_table,
|
|
783
|
+
)
|
|
784
|
+
|
|
785
|
+
# Scan the WHOLE test-doc tree (not just test_coverage.docs) so the
|
|
786
|
+
# candidate-reference list mirrors what validate_vb_registry_completeness
|
|
787
|
+
# saw (an AC doc that references VB ids is not in test_coverage.docs).
|
|
788
|
+
doc_texts = _iter_doc_texts(project_root, config=_config_without_doc_pin(config))
|
|
789
|
+
canonical_count = 0
|
|
790
|
+
declared: set[str] = set()
|
|
791
|
+
for doc, text in doc_texts:
|
|
792
|
+
if not is_canonical_vb_doc(output_path=doc):
|
|
793
|
+
continue
|
|
794
|
+
rows = parse_vb_table(text, source_doc=doc)
|
|
795
|
+
canonical_count += len(rows)
|
|
796
|
+
declared.update(_normalize_vb_id(row.vb_id) for row in rows)
|
|
797
|
+
|
|
798
|
+
# Collect unresolved references (id -> the docs that reference it) as the
|
|
799
|
+
# CANDIDATE list only — never auto-inserted into the canonical table.
|
|
800
|
+
candidates: dict[str, set[str]] = {}
|
|
801
|
+
for doc, text in doc_texts:
|
|
802
|
+
if is_canonical_vb_doc(output_path=doc):
|
|
803
|
+
continue
|
|
804
|
+
for ref in parse_vb_references(text, source_doc=doc):
|
|
805
|
+
if _normalize_vb_id(ref.vb_id) in declared:
|
|
806
|
+
continue
|
|
807
|
+
candidates.setdefault(ref.vb_id, set()).add(doc)
|
|
808
|
+
|
|
809
|
+
lines = [
|
|
810
|
+
"The generated verifiable-behavior (VB) registry is incomplete.",
|
|
811
|
+
"",
|
|
812
|
+
"Canonical registry:",
|
|
813
|
+
f"- {_CANONICAL_VB_OUTPUT_PATH} declares {canonical_count} canonical VB-* row(s).",
|
|
814
|
+
]
|
|
815
|
+
if candidates:
|
|
816
|
+
lines.append("")
|
|
817
|
+
lines.append("Unresolved VB references (candidate ids — NOT yet declared canonically):")
|
|
818
|
+
for vb_id in sorted(candidates):
|
|
819
|
+
docs = ", ".join(sorted(candidates[vb_id]))
|
|
820
|
+
lines.append(f"- {vb_id} (referenced in {docs})")
|
|
821
|
+
lines.extend(
|
|
822
|
+
[
|
|
823
|
+
"",
|
|
824
|
+
"Repair rules:",
|
|
825
|
+
f"- Rewrite ONLY {_CANONICAL_VB_OUTPUT_PATH}.",
|
|
826
|
+
"- Declare every real verifiable behavior exactly once as a first-column VB-* row.",
|
|
827
|
+
"- Use a referenced id only when it corresponds to a real behavior derived from "
|
|
828
|
+
"the requirements/design; fix a reference elsewhere only if its id is genuinely wrong.",
|
|
829
|
+
"- Do NOT add or modify `codd: covers` markers.",
|
|
830
|
+
"- Do NOT edit source or executable tests.",
|
|
831
|
+
]
|
|
832
|
+
)
|
|
833
|
+
return "\n".join(lines)
|
|
834
|
+
|
|
662
835
|
# ── stage: implement ────────────────────────────────────
|
|
663
836
|
|
|
664
837
|
def _stage_implement(self, project_root: Path, record: dict[str, Any], options: dict[str, Any]) -> None:
|
|
@@ -2522,6 +2695,7 @@ def _enforce_stage_coverage_gate(
|
|
|
2522
2695
|
coverage_gate_enabled,
|
|
2523
2696
|
coverage_gate_max_retries,
|
|
2524
2697
|
format_gap_feedback,
|
|
2698
|
+
project_expects_vb_registry,
|
|
2525
2699
|
run_implement_coverage_gate,
|
|
2526
2700
|
)
|
|
2527
2701
|
|
|
@@ -2536,6 +2710,24 @@ def _enforce_stage_coverage_gate(
|
|
|
2536
2710
|
if not coverage_gate_enabled(config):
|
|
2537
2711
|
return
|
|
2538
2712
|
|
|
2713
|
+
# GREENFIELD-ONLY empty-registry hard-fail (rear guard behind the generate
|
|
2714
|
+
# gate). For a project that is EXPECTED to own a canonical VB registry (it
|
|
2715
|
+
# plans/declares one — see project_expects_vb_registry), an empty audit means
|
|
2716
|
+
# NO verifiable behaviors were declared, so orphan never fires and the
|
|
2717
|
+
# marker-authenticity gate has nothing to judge — verify could pass over a
|
|
2718
|
+
# build whose VB-coverage contract was never generated. Fail honestly here.
|
|
2719
|
+
# This does NOT change the brownfield run_implement_coverage_gate
|
|
2720
|
+
# "nothing to audit -> pass" rule (that path is untouched); it gates ONLY the
|
|
2721
|
+
# greenfield autopilot, and ONLY when a VB surface was expected — a minimal
|
|
2722
|
+
# greenfield project with no VB surface still passes.
|
|
2723
|
+
if project_expects_vb_registry(project_root, config):
|
|
2724
|
+
if not build_vb_coverage_audit(project_root, config=config).rows:
|
|
2725
|
+
raise StageError(
|
|
2726
|
+
"greenfield requires a non-empty canonical VB registry in "
|
|
2727
|
+
"docs/test/test_strategy.md; no verifiable behaviors were declared, "
|
|
2728
|
+
"so coverage/authenticity cannot certify the generated system."
|
|
2729
|
+
)
|
|
2730
|
+
|
|
2539
2731
|
# Pass the configured test dirs as the audited output paths so the gate
|
|
2540
2732
|
# treats this as a test-related run (it is — every test the build will ever
|
|
2541
2733
|
# have now exists) and evaluates the FULL project VB universe in one pass.
|
|
@@ -829,6 +829,40 @@ def _python_decorator_start_lines(text: str) -> dict[int, int]:
|
|
|
829
829
|
return starts
|
|
830
830
|
|
|
831
831
|
|
|
832
|
+
def _python_test_function_nodes(
|
|
833
|
+
text: str,
|
|
834
|
+
) -> list[ast.FunctionDef | ast.AsyncFunctionDef]:
|
|
835
|
+
"""Top-level ``test_*`` functions (module- or class-level) via AST.
|
|
836
|
+
|
|
837
|
+
AST is signature-layout-agnostic, so a multi-line ``def test_x(\n a,\n) -> None:``
|
|
838
|
+
yields the CORRECT body extent — unlike the legacy line-scanner, which read the
|
|
839
|
+
closing ``)`` line (at the def's own indent) as the body dedent and collapsed
|
|
840
|
+
the body to the parameter-annotation lines (the ``no_assertion`` FALSE-RED this
|
|
841
|
+
fixes). A ``test_*`` nested INSIDE another function is excluded (not a
|
|
842
|
+
pytest-collected unit). Returns [] on syntax error (caller falls back to the
|
|
843
|
+
line-scanner).
|
|
844
|
+
"""
|
|
845
|
+
|
|
846
|
+
try:
|
|
847
|
+
tree = ast.parse(text)
|
|
848
|
+
except (SyntaxError, ValueError):
|
|
849
|
+
return []
|
|
850
|
+
parents: dict[ast.AST, ast.AST] = {}
|
|
851
|
+
for parent in ast.walk(tree):
|
|
852
|
+
for child in ast.iter_child_nodes(parent):
|
|
853
|
+
parents[child] = parent
|
|
854
|
+
nodes: list[ast.FunctionDef | ast.AsyncFunctionDef] = []
|
|
855
|
+
for node in ast.walk(tree):
|
|
856
|
+
if not isinstance(node, (ast.FunctionDef, ast.AsyncFunctionDef)):
|
|
857
|
+
continue
|
|
858
|
+
if not str(node.name).startswith("test_"):
|
|
859
|
+
continue
|
|
860
|
+
if not isinstance(parents.get(node), (ast.Module, ast.ClassDef)):
|
|
861
|
+
continue
|
|
862
|
+
nodes.append(node)
|
|
863
|
+
return sorted(nodes, key=lambda n: int(n.lineno))
|
|
864
|
+
|
|
865
|
+
|
|
832
866
|
@dataclass(frozen=True)
|
|
833
867
|
class PythonTestBlockProfile:
|
|
834
868
|
"""pytest / unittest structural adapter.
|
|
@@ -847,6 +881,48 @@ class PythonTestBlockProfile:
|
|
|
847
881
|
return rel_path.endswith(".py")
|
|
848
882
|
|
|
849
883
|
def parse_test_blocks(self, text: str) -> list[TestBlock]:
|
|
884
|
+
# AST is the authoritative body-extent source. The legacy line-scanner
|
|
885
|
+
# (kept as a fallback for syntactically-invalid files) mis-reads a
|
|
886
|
+
# MULTI-LINE def signature: the closing ``) -> None:`` sits at the def's
|
|
887
|
+
# own indent, so it was taken as the body dedent and the body collapsed to
|
|
888
|
+
# the parameter-annotation lines (a ``no_assertion`` FALSE-RED on a test
|
|
889
|
+
# that genuinely asserts). AST yields the true ``body[0]..end_lineno``
|
|
890
|
+
# extent regardless of signature layout, return annotation, decorators, or
|
|
891
|
+
# nested defs. has_assertion stays the raw primitive check (unchanged).
|
|
892
|
+
try:
|
|
893
|
+
ast.parse(text)
|
|
894
|
+
except (SyntaxError, ValueError):
|
|
895
|
+
return self._parse_test_blocks_linescan(text)
|
|
896
|
+
lines = text.splitlines()
|
|
897
|
+
blocks: list[TestBlock] = []
|
|
898
|
+
for node in _python_test_function_nodes(text):
|
|
899
|
+
def_line = int(node.lineno)
|
|
900
|
+
start_line = min(
|
|
901
|
+
[int(d.lineno) for d in node.decorator_list], default=def_line
|
|
902
|
+
)
|
|
903
|
+
body_start = int(node.body[0].lineno) if node.body else def_line
|
|
904
|
+
body_end = int(getattr(node, "end_lineno", body_start) or body_start)
|
|
905
|
+
body_text = "\n".join(lines[body_start - 1 : body_end])
|
|
906
|
+
skipped = bool(re.search(r"\bpytest\.skip\s*\(", body_text)) or bool(
|
|
907
|
+
re.search(r"\bself\.skipTest\s*\(", body_text)
|
|
908
|
+
)
|
|
909
|
+
decorator_text = "\n".join(lines[start_line - 1 : def_line - 1])
|
|
910
|
+
if _PY_SKIP_DECORATOR_RE.search(decorator_text):
|
|
911
|
+
skipped = True
|
|
912
|
+
has_assertion = bool(_PY_PRIMITIVE_ASSERT_RE.search(body_text))
|
|
913
|
+
blocks.append(
|
|
914
|
+
TestBlock(
|
|
915
|
+
start_line=start_line,
|
|
916
|
+
end_line=body_end,
|
|
917
|
+
is_executable=not skipped,
|
|
918
|
+
has_assertion=has_assertion,
|
|
919
|
+
label=node.name,
|
|
920
|
+
body_text=body_text,
|
|
921
|
+
)
|
|
922
|
+
)
|
|
923
|
+
return blocks
|
|
924
|
+
|
|
925
|
+
def _parse_test_blocks_linescan(self, text: str) -> list[TestBlock]:
|
|
850
926
|
lines = text.splitlines()
|
|
851
927
|
marker_lines = _shared_marker_lines(text)
|
|
852
928
|
decorator_starts = _python_decorator_start_lines(text)
|