codd-dev 2.50.0__tar.gz → 2.52.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.50.0 → codd_dev-2.52.0}/PKG-INFO +1 -1
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/__init__.py +1 -1
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/vb_marker_authenticity.py +482 -10
- {codd_dev-2.50.0 → codd_dev-2.52.0}/pyproject.toml +1 -1
- {codd_dev-2.50.0 → codd_dev-2.52.0}/.gitignore +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/LICENSE +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/README.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/bench_fixture/README.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/__main__.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/_git_helper.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/action_outcome.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/ai_invoke.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/ai_patch.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/artifact_contract.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/artifact_ids.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/artifacts/catalog.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/ask_user_question_adapter.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/assembler.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/bridge.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/brownfield/__init__.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/brownfield/pipeline.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/capability_completeness.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/claude_cli.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/cli.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/clustering.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/coherence_adapters.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/coherence_engine.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/confidence.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/config.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/config_schema.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/contracts.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/contracts_registry/__init__.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/contracts_registry/__main__.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/contracts_registry/certify.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/contracts_registry/generate_matrix.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/contracts_registry/registry.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/coverage_auditor.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/coverage_execution_coherence.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/coverage_metrics.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/dag/__init__.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/dag/auto_repair.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/dag/builder.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/dag/checks/__init__.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/dag/checks/_one_to_many_detection.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/dag/checks/artifact_contract_check.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/dag/checks/ci_health.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/dag/checks/dependency_freshness.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/dag/checks/depends_on_consistency.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/dag/checks/deployment_completeness.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/dag/checks/edge_validity.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/dag/checks/environment_coverage.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/dag/checks/implementation_coverage.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/dag/checks/node_completeness.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/dag/checks/opt_out.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/dag/checks/task_completion.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/dag/checks/transitive_closure.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/dag/checks/ui_coherence.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/dag/checks/user_journey_coherence.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/dag/coverage_axes.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/dag/defaults/cli.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/dag/defaults/cpp_embedded.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/dag/defaults/csharp.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/dag/defaults/elixir.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/dag/defaults/generic.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/dag/defaults/iot.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/dag/defaults/java.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/dag/defaults/kotlin.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/dag/defaults/mobile.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/dag/defaults/ruby.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/dag/defaults/rust.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/dag/defaults/scala.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/dag/defaults/swift.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/dag/defaults/test_frameworks.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/dag/defaults/web.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/dag/extractor.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/dag/impact.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/dag/runner.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/defaults.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/defaults.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/dependency_lock_coherence.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/deploy_targets/__init__.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/deploy_targets/app_service.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/deploy_targets/base.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/deploy_targets/docker_compose.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/deployer.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/deployment/__init__.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/deployment/checks/__init__.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/deployment/defaults/deploy_targets.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/deployment/defaults/runtime_capability_inference.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/deployment/defaults/schema_providers.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/deployment/defaults/verification_templates.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/deployment/extractor.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/deployment/providers/__init__.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/deployment/providers/ai_command.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/deployment/providers/ai_command_factory.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/deployment/providers/codex_app_server.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/deployment/providers/llm_consideration.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/deployment/providers/schema/__init__.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/deployment/providers/schema/prisma.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/deployment/providers/target/__init__.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/deployment/providers/target/docker_compose.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/deployment/providers/verification/__init__.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/deployment/providers/verification/assertion_handlers.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/deployment/providers/verification/cdp_browser.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/deployment/providers/verification/cdp_engines.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/deployment/providers/verification/cdp_launchers.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/deployment/providers/verification/cdp_wire.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/deployment/providers/verification/curl.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/deployment/providers/verification/form_strategies.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/deployment/providers/verification/means_catalog.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/deployment/providers/verification/playwright.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/deployment/providers/verification/pytest_http.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/deployment/providers/verification/vitest.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/design_md.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/diff/__init__.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/diff/apply.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/diff/engine.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/diff/persistence.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/diff/templates/diff_prompt.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/discovery.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/drift.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/e2e_contract_coherence.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/e2e_extractor.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/e2e_generator.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/e2e_harness.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/e2e_runner.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/elicit/__init__.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/elicit/apply.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/elicit/engine.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/elicit/finding.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/elicit/formatters/__init__.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/elicit/formatters/base.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/elicit/formatters/interactive.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/elicit/formatters/json_fmt.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/elicit/formatters/md.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/elicit/lexicon_loader.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/elicit/persistence.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/elicit/templates/elicit_prompt_L0.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/env_refs.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/extract_ai.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/extract_paths.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/extractor.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/fix/__init__.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/fix/candidate_selector.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/fix/design_updater.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/fix/impl_propagation.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/fix/interactive_prompt.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/fix/phenomenon_fixer.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/fix/phenomenon_parser.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/fix/risk_classifier.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/fix/templates/clarification_question.txt +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/fix/templates/design_update.txt +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/fix/templates/impl_update.txt +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/fix/templates/phenomenon_parse.txt +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/fix/templates/risk_assessment.txt +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/fix/templates_loader.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/fixer.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/fixup_drift.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/fixup_drift_strategies/__init__.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/fixup_drift_strategies/design_token_drift.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/fixup_drift_strategies/lexicon_violation.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/fixup_drift_strategies/url_drift.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/frontmatter.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/generator.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/git_evidence.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/graph.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/greenfield/__init__.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/greenfield/pipeline.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/hitl_session.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/hooks/__init__.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/hooks/pre-commit +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/hooks/recipes/claude_requirements_nudge.json +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/hooks/recipes/claude_settings_example.json +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/hooks/recipes/codex_hook.sh +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/hooks/recipes/git_post_commit.sh +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/hooks/recipes/git_pre_commit.sh +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/iac_nfr.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/implement_oracle.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/implement_oracle_scope.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/implementer/__init__.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/implementer/chunked_runner.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/implementer/typecheck_loop.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/implementer.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/import_coherence.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/inheritance.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/init/__init__.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/init/lexicon_suggest.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/init/llm_lexicon_suggester.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/init/stack_detector.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/knowledge_fetcher.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/lexicon.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/lexicon_cli/__init__.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/lexicon_cli/formatters/__init__.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/lexicon_cli/formatters/html.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/lexicon_cli/formatters/json_fmt.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/lexicon_cli/formatters/md.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/lexicon_cli/inspector.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/lexicon_cli/manager.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/lexicon_cli/reporter.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/lexicon_cli/threshold.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/llm/__init__.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/llm/approval.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/llm/best_practice_augmenter.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/llm/criteria_expander.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/llm/design_doc_extractor.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/llm/impl_step_deriver.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/llm/means_catalog_loader.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/llm/parser.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/llm/plan_deriver.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/llm/prompt_builder.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/llm/strategy_validator.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/llm/templates/best_practice_augment_meta.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/llm/templates/criteria_expand_meta.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/llm/templates/design_doc_extract_meta.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/llm/templates/impl_step_derive_meta.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/llm/templates/implementation_step_catalog.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/llm/templates/meta_instruction.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/llm/templates/plan_derive_meta.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/llm/templates/verification_means_catalog.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/mcp_server.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/measure.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/operational_e2e_audit.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/operations_derive.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/parsing/__init__.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/parsing/_shared.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/parsing/api_specs.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/parsing/filesystem_routes.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/parsing/iac.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/parsing/python_ast.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/parsing/schemas.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/parsing/tests_builddeps.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/parsing/treesitter.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/planner.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/policy.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/preflight/__init__.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/preflight/defaults/cli.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/preflight/defaults/generic.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/preflight/defaults/iot.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/preflight/defaults/mobile.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/preflight/defaults/web.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/project_types.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/propagate.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/propagation_common.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/propagator.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/reconciliation_ledger.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/reference_resolution.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/registry.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/repair/__init__.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/repair/approval_repair.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/repair/auto_scope_guard.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/repair/engine.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/repair/git_patcher.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/repair/history.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/repair/llm_repair_engine.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/repair/loop.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/repair/primary_picker.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/repair/proof_breaks.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/repair/repair_result.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/repair/repairability_classifier.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/repair/schema.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/repair/templates/analyze_meta.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/repair/templates/propose_meta.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/repair/templates/repair_strategy_meta.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/repair/templates/repairability_meta.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/repair/test_failure_attribution.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/repair/verify_runner.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/repair_slice.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/require.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/require_plugins.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/require_propagate.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/required_artifacts/defaults/cli.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/required_artifacts/defaults/generic.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/required_artifacts/defaults/iot.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/required_artifacts/defaults/mobile.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/required_artifacts/defaults/web.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/required_artifacts_deriver.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/requirement_completeness/defaults/cli.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/requirement_completeness/defaults/generic.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/requirement_completeness/defaults/iot.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/requirement_completeness/defaults/mobile.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/requirement_completeness/defaults/web.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/requirement_completeness_auditor.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/requirement_reconciliation.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/requirements_meta.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/restoration_report.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/restore.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/routes_extractor.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/runtime_smoke/__init__.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/runtime_smoke/checks.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/runtime_smoke/config.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/runtime_smoke/report.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/runtime_smoke/runner.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/scanner.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/schema_refs.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/screen_flow_validator.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/screen_transition_extractor.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/screen_transitions/defaults.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/skills_cli/__init__.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/skills_cli/discovery.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/skills_cli/manager.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/skills_cli/paths.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/surface_reconciliation.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/synth.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/templates/codd.yaml.tmpl +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/templates/conventions.yaml.tmpl +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/templates/data_dependencies.yaml.tmpl +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/templates/doc_links.yaml.tmpl +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/templates/extract_ai_prompt_baseline.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/templates/extracted/api-contract.md.j2 +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/templates/extracted/architecture-overview.md.j2 +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/templates/extracted/module-detail.md.j2 +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/templates/extracted/schema-design.md.j2 +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/templates/extracted/system-context.md.j2 +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/templates/gitignore.tmpl +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/templates/lexicon_questions.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/templates/lexicon_schema.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/templates/overrides.yaml.tmpl +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/test_detection.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/test_import_coherence.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/traceability.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/validator.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/vb_rerun_scope.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/verifiable_behavior_audit.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/watch/__init__.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/watch/events.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/watch/propagation_log.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/watch/propagation_pipeline.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/watch/test_runner.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/watch/watcher.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd/wiring.py +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ai_governance_eu_act/coverage_matrix.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ai_governance_eu_act/elicit_extend.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ai_governance_eu_act/lexicon.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ai_governance_eu_act/manifest.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ai_governance_eu_act/recommended_kinds.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ai_governance_eu_act/severity_rules.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/api_rate_limiting_caching/coverage_matrix.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/api_rate_limiting_caching/elicit_extend.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/api_rate_limiting_caching/lexicon.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/api_rate_limiting_caching/manifest.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/api_rate_limiting_caching/recommended_kinds.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/api_rate_limiting_caching/severity_rules.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/api_rest_openapi/coverage_matrix.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/api_rest_openapi/elicit_extend.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/api_rest_openapi/lexicon.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/api_rest_openapi/manifest.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/api_rest_openapi/recommended_kinds.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/api_rest_openapi/severity_rules.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/babok/elicit_extend.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/babok/lexicon.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/babok/manifest.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/babok/recommended_kinds.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/babok/severity_rules.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/backend_event_cloudevents/coverage_matrix.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/backend_event_cloudevents/elicit_extend.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/backend_event_cloudevents/lexicon.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/backend_event_cloudevents/manifest.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/backend_event_cloudevents/recommended_kinds.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/backend_event_cloudevents/severity_rules.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/backend_graphql/coverage_matrix.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/backend_graphql/elicit_extend.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/backend_graphql/lexicon.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/backend_graphql/manifest.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/backend_graphql/recommended_kinds.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/backend_graphql/severity_rules.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/backend_grpc_proto/coverage_matrix.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/backend_grpc_proto/elicit_extend.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/backend_grpc_proto/lexicon.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/backend_grpc_proto/manifest.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/backend_grpc_proto/recommended_kinds.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/backend_grpc_proto/severity_rules.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/compliance_hipaa/coverage_matrix.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/compliance_hipaa/elicit_extend.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/compliance_hipaa/lexicon.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/compliance_hipaa/manifest.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/compliance_hipaa/recommended_kinds.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/compliance_hipaa/severity_rules.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/compliance_iso27001/coverage_matrix.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/compliance_iso27001/elicit_extend.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/compliance_iso27001/lexicon.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/compliance_iso27001/manifest.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/compliance_iso27001/recommended_kinds.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/compliance_iso27001/severity_rules.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/compliance_pci_dss_4/coverage_matrix.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/compliance_pci_dss_4/elicit_extend.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/compliance_pci_dss_4/lexicon.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/compliance_pci_dss_4/manifest.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/compliance_pci_dss_4/recommended_kinds.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/compliance_pci_dss_4/severity_rules.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/data_aggregation_policies/coverage_matrix.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/data_aggregation_policies/elicit_extend.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/data_aggregation_policies/lexicon.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/data_aggregation_policies/manifest.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/data_aggregation_policies/recommended_kinds.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/data_aggregation_policies/severity_rules.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/coverage_matrix.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/elicit_extend.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/lexicon.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/manifest.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/recommended_kinds.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/severity_rules.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/data_governance_appi_gdpr/coverage_matrix.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/data_governance_appi_gdpr/elicit_extend.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/data_governance_appi_gdpr/lexicon.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/data_governance_appi_gdpr/manifest.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/data_governance_appi_gdpr/recommended_kinds.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/data_governance_appi_gdpr/severity_rules.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/data_nosql_jsonschema/coverage_matrix.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/data_nosql_jsonschema/elicit_extend.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/data_nosql_jsonschema/lexicon.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/data_nosql_jsonschema/manifest.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/data_nosql_jsonschema/recommended_kinds.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/data_nosql_jsonschema/severity_rules.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/data_relational_iso_sql/coverage_matrix.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/data_relational_iso_sql/elicit_extend.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/data_relational_iso_sql/lexicon.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/data_relational_iso_sql/manifest.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/data_relational_iso_sql/recommended_kinds.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/data_relational_iso_sql/severity_rules.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ddd_domain_driven_design/coverage_matrix.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ddd_domain_driven_design/elicit_extend.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ddd_domain_driven_design/lexicon.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ddd_domain_driven_design/manifest.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ddd_domain_driven_design/recommended_kinds.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ddd_domain_driven_design/severity_rules.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/dora_sre_metrics/coverage_matrix.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/dora_sre_metrics/elicit_extend.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/dora_sre_metrics/lexicon.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/dora_sre_metrics/manifest.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/dora_sre_metrics/recommended_kinds.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/dora_sre_metrics/severity_rules.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/i18n_unicode_cldr/coverage_matrix.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/i18n_unicode_cldr/elicit_extend.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/i18n_unicode_cldr/lexicon.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/i18n_unicode_cldr/manifest.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/i18n_unicode_cldr/recommended_kinds.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/i18n_unicode_cldr/severity_rules.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ml_model_cards/coverage_matrix.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ml_model_cards/elicit_extend.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ml_model_cards/lexicon.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ml_model_cards/manifest.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ml_model_cards/recommended_kinds.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ml_model_cards/severity_rules.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/mobile_a11y_native/coverage_matrix.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/mobile_a11y_native/elicit_extend.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/mobile_a11y_native/lexicon.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/mobile_a11y_native/manifest.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/mobile_a11y_native/recommended_kinds.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/mobile_a11y_native/severity_rules.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/mobile_android_material3/coverage_matrix.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/mobile_android_material3/elicit_extend.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/mobile_android_material3/lexicon.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/mobile_android_material3/manifest.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/mobile_android_material3/recommended_kinds.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/mobile_android_material3/severity_rules.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/mobile_ios_hig/coverage_matrix.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/mobile_ios_hig/elicit_extend.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/mobile_ios_hig/lexicon.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/mobile_ios_hig/manifest.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/mobile_ios_hig/recommended_kinds.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/mobile_ios_hig/severity_rules.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/mobile_security_masvs/coverage_matrix.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/mobile_security_masvs/elicit_extend.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/mobile_security_masvs/lexicon.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/mobile_security_masvs/manifest.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/mobile_security_masvs/recommended_kinds.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/mobile_security_masvs/severity_rules.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ops_cicd_pipeline/coverage_matrix.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ops_cicd_pipeline/elicit_extend.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ops_cicd_pipeline/lexicon.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ops_cicd_pipeline/manifest.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ops_cicd_pipeline/recommended_kinds.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ops_cicd_pipeline/severity_rules.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ops_iac_terraform/coverage_matrix.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ops_iac_terraform/elicit_extend.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ops_iac_terraform/lexicon.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ops_iac_terraform/manifest.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ops_iac_terraform/recommended_kinds.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ops_iac_terraform/severity_rules.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ops_kubernetes/coverage_matrix.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ops_kubernetes/elicit_extend.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ops_kubernetes/lexicon.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ops_kubernetes/manifest.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ops_kubernetes/recommended_kinds.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ops_kubernetes/severity_rules.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ops_observability_otel/coverage_matrix.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ops_observability_otel/elicit_extend.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ops_observability_otel/lexicon.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ops_observability_otel/manifest.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ops_observability_otel/recommended_kinds.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/ops_observability_otel/severity_rules.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/process_iso25010/coverage_matrix.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/process_iso25010/elicit_extend.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/process_iso25010/lexicon.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/process_iso25010/manifest.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/process_iso25010/recommended_kinds.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/process_iso25010/severity_rules.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/process_test_iso29119/coverage_matrix.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/process_test_iso29119/elicit_extend.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/process_test_iso29119/lexicon.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/process_test_iso29119/manifest.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/process_test_iso29119/recommended_kinds.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/process_test_iso29119/severity_rules.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/twelve_factor_app/coverage_matrix.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/twelve_factor_app/elicit_extend.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/twelve_factor_app/lexicon.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/twelve_factor_app/manifest.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/twelve_factor_app/recommended_kinds.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/twelve_factor_app/severity_rules.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/coverage_matrix.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/elicit_extend.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/lexicon.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/manifest.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/recommended_kinds.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/severity_rules.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_authn_webauthn/coverage_matrix.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_authn_webauthn/elicit_extend.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_authn_webauthn/lexicon.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_authn_webauthn/manifest.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_authn_webauthn/recommended_kinds.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_authn_webauthn/severity_rules.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_browser_compat/coverage_matrix.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_browser_compat/elicit_extend.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_browser_compat/lexicon.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_browser_compat/manifest.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_browser_compat/recommended_kinds.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_browser_compat/severity_rules.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_forms_html5/coverage_matrix.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_forms_html5/elicit_extend.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_forms_html5/lexicon.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_forms_html5/manifest.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_forms_html5/recommended_kinds.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_forms_html5/severity_rules.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_performance_core_web_vitals/coverage_matrix.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_performance_core_web_vitals/elicit_extend.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_performance_core_web_vitals/lexicon.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_performance_core_web_vitals/manifest.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_performance_core_web_vitals/recommended_kinds.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_performance_core_web_vitals/severity_rules.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_pwa_manifest/coverage_matrix.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_pwa_manifest/elicit_extend.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_pwa_manifest/lexicon.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_pwa_manifest/manifest.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_pwa_manifest/recommended_kinds.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_pwa_manifest/severity_rules.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_responsive/coverage_matrix.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_responsive/elicit_extend.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_responsive/lexicon.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_responsive/manifest.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_responsive/recommended_kinds.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_responsive/severity_rules.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_security_owasp/coverage_matrix.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_security_owasp/elicit_extend.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_security_owasp/lexicon.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_security_owasp/manifest.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_security_owasp/recommended_kinds.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_security_owasp/severity_rules.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_seo_schemaorg/coverage_matrix.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_seo_schemaorg/elicit_extend.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_seo_schemaorg/lexicon.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_seo_schemaorg/manifest.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_seo_schemaorg/recommended_kinds.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/lexicons/web_seo_schemaorg/severity_rules.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/codd_plugins/stack_map.yaml +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/docs/cookbook/cdp_browser/README.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/docs/cookbook/presentation_aggregation/README.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/docs/requirements/README.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/dogfood/README.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/dogfood/fixtures/flat_py_app/README.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/examples/README.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/skills/codd-assemble/SKILL.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/skills/codd-evolve/SKILL.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/skills/codd-generate/SKILL.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/skills/codd-greenfield/SKILL.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/skills/codd-impact/SKILL.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/skills/codd-init/SKILL.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/skills/codd-propagate/SKILL.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/skills/codd-restore/SKILL.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/skills/codd-scan/SKILL.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.0}/skills/codd-validate/SKILL.md +0 -0
- {codd_dev-2.50.0 → codd_dev-2.52.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.52.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
|
|
@@ -39,11 +39,22 @@ each later stage only strengthens, never replaces, the earlier ones:
|
|
|
39
39
|
helper (``expectSuccessfulRun(result, fixture.stdout)`` whose body runs the
|
|
40
40
|
real ``expect(result.exitCode).toBe(0)``). Evidence is therefore::
|
|
41
41
|
|
|
42
|
-
direct primitive assertion in the test body
|
|
42
|
+
a direct primitive assertion in the test body that is NOT constant-only
|
|
43
43
|
OR
|
|
44
44
|
a call to a RESOLVED helper whose body contains a primitive assertion/fail
|
|
45
45
|
AND references the helper's argument(s) (an "argument anchor")
|
|
46
46
|
|
|
47
|
+
A DIRECT primitive assertion is credited only when it references at least one
|
|
48
|
+
non-ignored name (a SUT call, exception, state, local, or output). A
|
|
49
|
+
CONSTANT-only direct assertion (``assert True`` / ``assert 1 == 1`` /
|
|
50
|
+
``expect(true).toBe(true)``) references nothing but assertion APIs, literals,
|
|
51
|
+
keywords and obvious builtins — it proves nothing, so it is NOT evidence (the
|
|
52
|
+
direct-side analogue of the helper-side argument anchor that already rejects a
|
|
53
|
+
constant-only helper). It is NOT, however, a dataflow analysis: a
|
|
54
|
+
local-constant alias (``x = True; assert x``) is a deliberate, documented
|
|
55
|
+
residual — closing it risks false-RED on legitimate callback / mutation tests
|
|
56
|
+
(``called = False; …; assert called``).
|
|
57
|
+
|
|
47
58
|
The argument anchor is what keeps this anti-false-green: a no-op helper
|
|
48
59
|
(``function expectSuccess() { expect(true).toBe(true); }``) does not reference
|
|
49
60
|
its arguments, so marker-spam delegating to it still FAILS. The helper NAME
|
|
@@ -81,6 +92,7 @@ from __future__ import annotations
|
|
|
81
92
|
|
|
82
93
|
import ast
|
|
83
94
|
import re
|
|
95
|
+
import textwrap
|
|
84
96
|
from dataclasses import dataclass, field
|
|
85
97
|
from pathlib import Path
|
|
86
98
|
from typing import Any, Callable, Iterable, Protocol
|
|
@@ -134,6 +146,9 @@ class TestBlock:
|
|
|
134
146
|
#: ``ok`` is True iff the block carries credible assertion evidence. ``reason``
|
|
135
147
|
#: is a machine token the gate maps to a violation kind / message:
|
|
136
148
|
#: ``direct`` — a direct primitive assertion in the body (pass)
|
|
149
|
+
#: ``constant_direct`` — a direct primitive assertion that is CONSTANT-only
|
|
150
|
+
#: (``assert True`` / ``expect(true).toBe(true)``) —
|
|
151
|
+
#: references no non-ignored name, so proves nothing
|
|
137
152
|
#: ``helper_resolved`` — a resolved helper with primitive + arg anchor (pass)
|
|
138
153
|
#: ``no_assertion`` — neither a primitive nor any assertion-like call
|
|
139
154
|
#: ``unresolved_helper`` — an assertion-like call not resolvable 1-hop
|
|
@@ -407,6 +422,53 @@ def _first_child_block(group: TestBlock, blocks: list[TestBlock]) -> TestBlock |
|
|
|
407
422
|
# ---------------------------------------------------------------------------
|
|
408
423
|
|
|
409
424
|
|
|
425
|
+
def _helper_evidence(
|
|
426
|
+
adapter: TestBlockProfile,
|
|
427
|
+
block: TestBlock,
|
|
428
|
+
*,
|
|
429
|
+
importer_text: str,
|
|
430
|
+
importer_rel: str,
|
|
431
|
+
project_root: Path,
|
|
432
|
+
) -> AssertionEvidence:
|
|
433
|
+
"""Resolve a block's DELEGATED-assertion (helper) evidence, fail-closed.
|
|
434
|
+
|
|
435
|
+
Thin wrapper over the per-profile :meth:`TestBlockProfile.resolve_assertion_
|
|
436
|
+
evidence`: a resolver that raises is treated as NO evidence (toward
|
|
437
|
+
false-RED, never false-GREEN) rather than crashing the gate.
|
|
438
|
+
"""
|
|
439
|
+
|
|
440
|
+
try:
|
|
441
|
+
return adapter.resolve_assertion_evidence(
|
|
442
|
+
block,
|
|
443
|
+
importer_text=importer_text,
|
|
444
|
+
importer_rel=importer_rel,
|
|
445
|
+
project_root=project_root,
|
|
446
|
+
)
|
|
447
|
+
except Exception: # noqa: BLE001 — resolver that throws ⇒ no evidence.
|
|
448
|
+
return AssertionEvidence(ok=False, reason="no_assertion", detail="resolver error")
|
|
449
|
+
|
|
450
|
+
|
|
451
|
+
def _direct_evidence(adapter: TestBlockProfile, block: TestBlock) -> AssertionEvidence:
|
|
452
|
+
"""Resolve a block's DIRECT (in-body) primitive-assertion evidence.
|
|
453
|
+
|
|
454
|
+
The built-in Python/TypeScript adapters expose
|
|
455
|
+
``resolve_direct_assertion_evidence`` which decides whether the direct
|
|
456
|
+
primitive assertion is constant-only (``constant_direct`` ⇒ not ok) or
|
|
457
|
+
references a real name (``direct`` ⇒ ok). An EXTERNAL adapter that predates
|
|
458
|
+
this method has no such hook; for back-compat it keeps the pre-existing
|
|
459
|
+
behavior (a raw primitive is credited as ``direct``) — only the built-in
|
|
460
|
+
stacks are tightened here.
|
|
461
|
+
"""
|
|
462
|
+
|
|
463
|
+
resolver = getattr(adapter, "resolve_direct_assertion_evidence", None)
|
|
464
|
+
if callable(resolver):
|
|
465
|
+
try:
|
|
466
|
+
return resolver(block)
|
|
467
|
+
except Exception: # noqa: BLE001 — a resolver that throws ⇒ keep credit (back-compat).
|
|
468
|
+
return AssertionEvidence(ok=True, reason="direct")
|
|
469
|
+
return AssertionEvidence(ok=True, reason="direct")
|
|
470
|
+
|
|
471
|
+
|
|
410
472
|
def build_authenticity_report(
|
|
411
473
|
project_root: Path | str,
|
|
412
474
|
*,
|
|
@@ -582,20 +644,34 @@ def build_authenticity_report(
|
|
|
582
644
|
continue
|
|
583
645
|
|
|
584
646
|
# ── Stage 3 (assertion EVIDENCE): direct primitive OR resolved helper ──
|
|
647
|
+
# A DIRECT primitive assertion must not be CONSTANT-only. ``assert
|
|
648
|
+
# True`` / ``expect(true).toBe(true)`` is a primitive (so
|
|
649
|
+
# ``has_assertion`` is True) yet proves nothing — the direct-side
|
|
650
|
+
# analogue of the helper-side argument anchor. We resolve direct
|
|
651
|
+
# evidence through ``_direct_evidence`` (per-profile, AST for Python /
|
|
652
|
+
# lexical for TS); if it is constant-only we DO NOT immediately fail —
|
|
653
|
+
# the same block may ALSO call a credible helper, so we fall back to
|
|
654
|
+
# the helper resolver and only RED when BOTH paths fail.
|
|
585
655
|
if block.has_assertion:
|
|
586
|
-
evidence =
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
656
|
+
evidence = _direct_evidence(adapter, block)
|
|
657
|
+
if not evidence.ok:
|
|
658
|
+
helper_evidence = _helper_evidence(
|
|
659
|
+
adapter,
|
|
590
660
|
block,
|
|
591
661
|
importer_text=text,
|
|
592
662
|
importer_rel=rel,
|
|
593
663
|
project_root=project_root,
|
|
594
664
|
)
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
665
|
+
if helper_evidence.ok:
|
|
666
|
+
evidence = helper_evidence
|
|
667
|
+
else:
|
|
668
|
+
evidence = _helper_evidence(
|
|
669
|
+
adapter,
|
|
670
|
+
block,
|
|
671
|
+
importer_text=text,
|
|
672
|
+
importer_rel=rel,
|
|
673
|
+
project_root=project_root,
|
|
674
|
+
)
|
|
599
675
|
if not evidence.ok:
|
|
600
676
|
label = f" ({block.label})" if block.label else ""
|
|
601
677
|
violations.append(
|
|
@@ -643,7 +719,14 @@ def _no_assertion_message(
|
|
|
643
719
|
"""
|
|
644
720
|
|
|
645
721
|
head = f"{rel}:{marker.line} `codd: covers vb={marker.vb_id}` is attached to a test{label}"
|
|
646
|
-
if evidence.reason == "
|
|
722
|
+
if evidence.reason == "constant_direct":
|
|
723
|
+
why = (
|
|
724
|
+
" whose direct primitive assertion is CONSTANT-only "
|
|
725
|
+
"(`assert True`, `assert 1 == 1`, or `expect(true).toBe(true)`) — "
|
|
726
|
+
"a constant assertion proves nothing. Assert against an observed result, "
|
|
727
|
+
"exception, state, or output that would FAIL if the behavior were broken."
|
|
728
|
+
)
|
|
729
|
+
elif evidence.reason == "unresolved_helper":
|
|
647
730
|
why = (
|
|
648
731
|
" whose only assertion is delegated to a helper that could not be resolved "
|
|
649
732
|
f"({evidence.detail or 'no resolvable helper body'}). An unresolved assertion "
|
|
@@ -735,6 +818,301 @@ def render_authenticity_markdown(report: AuthenticityReport) -> str:
|
|
|
735
818
|
return "\n".join(lines)
|
|
736
819
|
|
|
737
820
|
|
|
821
|
+
# ---------------------------------------------------------------------------
|
|
822
|
+
# DIRECT-assertion evidence (the direct-side analogue of the helper argument
|
|
823
|
+
# anchor). A primitive assertion IN THE TEST BODY is credited only when it
|
|
824
|
+
# references at least one NON-IGNORED name — a SUT call, exception, Enum, state,
|
|
825
|
+
# local, or output. A CONSTANT-only direct assertion (``assert True`` /
|
|
826
|
+
# ``expect(true).toBe(true)``) references nothing but assertion APIs, literals,
|
|
827
|
+
# keywords and obvious builtins, so it proves nothing and is NOT evidence.
|
|
828
|
+
#
|
|
829
|
+
# GENERALITY GUARDRAILS (do NOT widen the ignored sets):
|
|
830
|
+
# * Only assertion APIs, literals/keywords, and obvious builtins are ignored.
|
|
831
|
+
# SUT call names, exception classes, Enum names and local variables are NEVER
|
|
832
|
+
# ignored — so ``assert validate()`` (validate), ``expect(conv()).toBe(1)``
|
|
833
|
+
# (conv) and ``assert exc.value.code == ErrorCode.X`` (exc) stay GREEN. This
|
|
834
|
+
# is what prevents a false-RED on a legitimate NO-FIXTURE test.
|
|
835
|
+
# * No local-constant / dataflow analysis. ``x = True; assert x`` stays GREEN —
|
|
836
|
+
# closing it would risk false-RED on callback / mutation tests
|
|
837
|
+
# (``called = False; …; assert called``). It is a documented residual.
|
|
838
|
+
# ---------------------------------------------------------------------------
|
|
839
|
+
|
|
840
|
+
|
|
841
|
+
#: Python names that are NOT credit-worthy references inside a direct primitive
|
|
842
|
+
#: assertion: the assertion APIs themselves plus literals / keywords / obvious
|
|
843
|
+
#: builtins. NOTHING here is a SUT symbol — a function/Enum/exception/local name
|
|
844
|
+
#: is never ignored, so a real observation (``assert validate()`` /
|
|
845
|
+
#: ``assert exc.value.code == ErrorCode.X``) is always credited.
|
|
846
|
+
_PY_DIRECT_IGNORED_NAMES = frozenset(
|
|
847
|
+
{
|
|
848
|
+
"assert",
|
|
849
|
+
"pytest",
|
|
850
|
+
"self",
|
|
851
|
+
"cls",
|
|
852
|
+
"np",
|
|
853
|
+
"True",
|
|
854
|
+
"False",
|
|
855
|
+
"None",
|
|
856
|
+
"Ellipsis",
|
|
857
|
+
"bool",
|
|
858
|
+
"int",
|
|
859
|
+
"float",
|
|
860
|
+
"str",
|
|
861
|
+
"bytes",
|
|
862
|
+
"list",
|
|
863
|
+
"tuple",
|
|
864
|
+
"dict",
|
|
865
|
+
"set",
|
|
866
|
+
"frozenset",
|
|
867
|
+
"len",
|
|
868
|
+
"sum",
|
|
869
|
+
"min",
|
|
870
|
+
"max",
|
|
871
|
+
"all",
|
|
872
|
+
"any",
|
|
873
|
+
"isinstance",
|
|
874
|
+
"issubclass",
|
|
875
|
+
"type",
|
|
876
|
+
"object",
|
|
877
|
+
"Exception",
|
|
878
|
+
"BaseException",
|
|
879
|
+
"AssertionError",
|
|
880
|
+
"ValueError",
|
|
881
|
+
"TypeError",
|
|
882
|
+
"RuntimeError",
|
|
883
|
+
}
|
|
884
|
+
)
|
|
885
|
+
|
|
886
|
+
|
|
887
|
+
#: TypeScript/JavaScript counterpart of :data:`_PY_DIRECT_IGNORED_NAMES`: the
|
|
888
|
+
#: vitest/jest/chai assertion APIs, the matcher names, plus literals / keywords /
|
|
889
|
+
#: obvious global builtins. A SUT call name / class is never ignored, so
|
|
890
|
+
#: ``expect(conv()).toBe(1)`` (``conv`` remains) stays GREEN while
|
|
891
|
+
#: ``expect(true).toBe(true)`` (only ignored names) becomes RED.
|
|
892
|
+
#:
|
|
893
|
+
#: NOTE (TS inline-block leak — why the test-DECLARATION globals are here too):
|
|
894
|
+
#: unlike a Python ``def test_x():`` whose ``body_text`` starts AFTER the def
|
|
895
|
+
#: line, a TS leaf block's ``body_text`` for an INLINE form
|
|
896
|
+
#: (``it('x', () => { expect(true).toBe(true); });``) is the WHOLE ``it(...)``
|
|
897
|
+
#: line — so the lexical window harvests the block-declaration callee (``it`` /
|
|
898
|
+
#: ``test`` / ``describe``) and the arrow keyword (``async``) as "references".
|
|
899
|
+
#: These are vitest/jest reserved test-framework globals on the same footing as
|
|
900
|
+
#: ``expect`` / ``vi`` / the matchers, so they are ignored too — otherwise an
|
|
901
|
+
#: inline constant-only ``it('x', () => expect(true).toBe(true))`` would leak
|
|
902
|
+
#: ``it`` and be mis-credited ``direct``. A real observation
|
|
903
|
+
#: (``expect(conv()).toBe(1)``) still retains its SUT name (``conv``), so adding
|
|
904
|
+
#: these never false-REDs a genuine test; and were a SUT ever literally named
|
|
905
|
+
#: ``it``/``test``/``describe`` the only effect is a fail-CLOSED RED on that one
|
|
906
|
+
#: assertion (safe direction), never a false-GREEN.
|
|
907
|
+
_TS_DIRECT_IGNORED_NAMES = frozenset(
|
|
908
|
+
{
|
|
909
|
+
"expect",
|
|
910
|
+
"vi",
|
|
911
|
+
"assert",
|
|
912
|
+
"throw",
|
|
913
|
+
"new",
|
|
914
|
+
"typeof",
|
|
915
|
+
"instanceof",
|
|
916
|
+
"async",
|
|
917
|
+
"await",
|
|
918
|
+
# vitest/jest block-declaration + lifecycle globals (leak from an inline
|
|
919
|
+
# block's ``body_text``; see the NOTE above).
|
|
920
|
+
"it",
|
|
921
|
+
"test",
|
|
922
|
+
"describe",
|
|
923
|
+
"xit",
|
|
924
|
+
"xtest",
|
|
925
|
+
"xdescribe",
|
|
926
|
+
"fit",
|
|
927
|
+
"fdescribe",
|
|
928
|
+
"beforeEach",
|
|
929
|
+
"afterEach",
|
|
930
|
+
"beforeAll",
|
|
931
|
+
"afterAll",
|
|
932
|
+
"true",
|
|
933
|
+
"false",
|
|
934
|
+
"null",
|
|
935
|
+
"undefined",
|
|
936
|
+
"NaN",
|
|
937
|
+
"Infinity",
|
|
938
|
+
"toBe",
|
|
939
|
+
"toEqual",
|
|
940
|
+
"toStrictEqual",
|
|
941
|
+
"toThrow",
|
|
942
|
+
"toContain",
|
|
943
|
+
"toMatch",
|
|
944
|
+
"toHaveLength",
|
|
945
|
+
"Boolean",
|
|
946
|
+
"Number",
|
|
947
|
+
"String",
|
|
948
|
+
"Object",
|
|
949
|
+
"Array",
|
|
950
|
+
"Map",
|
|
951
|
+
"Set",
|
|
952
|
+
"Date",
|
|
953
|
+
"RegExp",
|
|
954
|
+
"Math",
|
|
955
|
+
"JSON",
|
|
956
|
+
"Promise",
|
|
957
|
+
"Error",
|
|
958
|
+
"TypeError",
|
|
959
|
+
"RangeError",
|
|
960
|
+
"SyntaxError",
|
|
961
|
+
}
|
|
962
|
+
)
|
|
963
|
+
|
|
964
|
+
|
|
965
|
+
def _py_callee_name(node: ast.AST) -> str:
|
|
966
|
+
"""Dotted callee name of a call target (``pytest.raises`` / ``self.assertX``)."""
|
|
967
|
+
|
|
968
|
+
if isinstance(node, ast.Name):
|
|
969
|
+
return node.id
|
|
970
|
+
if isinstance(node, ast.Attribute):
|
|
971
|
+
base = _py_callee_name(node.value)
|
|
972
|
+
return f"{base}.{node.attr}" if base else node.attr
|
|
973
|
+
return ""
|
|
974
|
+
|
|
975
|
+
|
|
976
|
+
def _is_py_primitive_assert_node(node: ast.AST) -> bool:
|
|
977
|
+
"""Whether ``node`` is a PRIMITIVE python assertion (mirrors ``_PY_PRIMITIVE_ASSERT_RE``).
|
|
978
|
+
|
|
979
|
+
An ``assert`` statement, a ``with pytest.raises(...)`` block, or an expression
|
|
980
|
+
statement calling ``pytest.fail`` / ``self.fail`` / ``self.assert*`` /
|
|
981
|
+
``np.testing.assert*``. A bare call to a NAMED helper is NOT primitive (it is
|
|
982
|
+
resolved via the evidence graph), so it is not matched here.
|
|
983
|
+
"""
|
|
984
|
+
|
|
985
|
+
if isinstance(node, ast.Assert):
|
|
986
|
+
return True
|
|
987
|
+
if isinstance(node, (ast.With, ast.AsyncWith)):
|
|
988
|
+
for item in node.items:
|
|
989
|
+
expr = item.context_expr
|
|
990
|
+
if isinstance(expr, ast.Call) and _py_callee_name(expr.func) == "pytest.raises":
|
|
991
|
+
return True
|
|
992
|
+
return False
|
|
993
|
+
if isinstance(node, ast.Expr) and isinstance(node.value, ast.Call):
|
|
994
|
+
callee = _py_callee_name(node.value.func)
|
|
995
|
+
return (
|
|
996
|
+
callee == "pytest.fail"
|
|
997
|
+
or callee == "self.fail"
|
|
998
|
+
or callee.startswith("self.assert")
|
|
999
|
+
or callee.startswith("np.testing.assert")
|
|
1000
|
+
)
|
|
1001
|
+
return False
|
|
1002
|
+
|
|
1003
|
+
|
|
1004
|
+
def _python_direct_assertion_evidence(body_text: str) -> AssertionEvidence:
|
|
1005
|
+
"""AST verdict: does ``body_text`` carry a NON-constant direct primitive assertion?
|
|
1006
|
+
|
|
1007
|
+
For each primitive-assert node, collect every ``ast.Name`` id inside it and
|
|
1008
|
+
subtract :data:`_PY_DIRECT_IGNORED_NAMES`. If ANY name remains the assertion
|
|
1009
|
+
references a real observation (a SUT call, exception, Enum, local, or state)
|
|
1010
|
+
⇒ ``direct`` (ok). If every assertion is constant-only ⇒ ``constant_direct``
|
|
1011
|
+
(not ok). Falls back to the lexical scanner on a syntax error so an
|
|
1012
|
+
un-parseable body never false-REDs here (it degrades to the line-based path,
|
|
1013
|
+
which itself fails OPEN per window).
|
|
1014
|
+
"""
|
|
1015
|
+
|
|
1016
|
+
try:
|
|
1017
|
+
tree = ast.parse(textwrap.dedent(body_text))
|
|
1018
|
+
except (SyntaxError, ValueError):
|
|
1019
|
+
return _lexical_direct_assertion_evidence(
|
|
1020
|
+
body_text,
|
|
1021
|
+
primitive_re=_PY_PRIMITIVE_ASSERT_RE,
|
|
1022
|
+
ignored_names=_PY_DIRECT_IGNORED_NAMES,
|
|
1023
|
+
)
|
|
1024
|
+
|
|
1025
|
+
saw_primitive = False
|
|
1026
|
+
for node in ast.walk(tree):
|
|
1027
|
+
if not _is_py_primitive_assert_node(node):
|
|
1028
|
+
continue
|
|
1029
|
+
saw_primitive = True
|
|
1030
|
+
ids = {n.id for n in ast.walk(node) if isinstance(n, ast.Name)}
|
|
1031
|
+
if ids - _PY_DIRECT_IGNORED_NAMES:
|
|
1032
|
+
return AssertionEvidence(ok=True, reason="direct")
|
|
1033
|
+
|
|
1034
|
+
if not saw_primitive:
|
|
1035
|
+
# The raw regex (``has_assertion``) matched but the AST recognized no
|
|
1036
|
+
# primitive node (e.g. ``assert`` inside a string, or an assertion shape
|
|
1037
|
+
# the AST walker does not classify). Fail OPEN — keep the pre-existing
|
|
1038
|
+
# ``direct`` credit rather than inventing a false-RED.
|
|
1039
|
+
return AssertionEvidence(ok=True, reason="direct")
|
|
1040
|
+
return AssertionEvidence(ok=False, reason="constant_direct")
|
|
1041
|
+
|
|
1042
|
+
|
|
1043
|
+
def _primitive_assertion_windows(body: str, primitive_re: re.Pattern[str]) -> list[str]:
|
|
1044
|
+
"""Each primitive-assertion line PLUS its more-indented continuation block.
|
|
1045
|
+
|
|
1046
|
+
Mirrors the window walk in :func:`_body_references_params`: an assertion's
|
|
1047
|
+
"window" is the matching line plus every following line indented MORE than it
|
|
1048
|
+
(its block) — so a context-manager assertion (``with pytest.raises(...):\\n
|
|
1049
|
+
fn()``) carries the ``fn()`` call into its window, while a trailing
|
|
1050
|
+
same-indent statement after a constant assertion is not folded in.
|
|
1051
|
+
"""
|
|
1052
|
+
|
|
1053
|
+
lines = body.splitlines()
|
|
1054
|
+
windows: list[str] = []
|
|
1055
|
+
total = len(lines)
|
|
1056
|
+
for idx, line in enumerate(lines):
|
|
1057
|
+
if not primitive_re.search(line):
|
|
1058
|
+
continue
|
|
1059
|
+
base_indent = len(line[: len(line) - len(line.lstrip())].expandtabs())
|
|
1060
|
+
window = [line]
|
|
1061
|
+
scan = idx + 1
|
|
1062
|
+
while scan < total:
|
|
1063
|
+
nxt = lines[scan]
|
|
1064
|
+
if not nxt.strip():
|
|
1065
|
+
scan += 1
|
|
1066
|
+
continue
|
|
1067
|
+
nxt_indent = len(nxt[: len(nxt) - len(nxt.lstrip())].expandtabs())
|
|
1068
|
+
if nxt_indent <= base_indent:
|
|
1069
|
+
break
|
|
1070
|
+
window.append(nxt)
|
|
1071
|
+
scan += 1
|
|
1072
|
+
windows.append("\n".join(window))
|
|
1073
|
+
return windows
|
|
1074
|
+
|
|
1075
|
+
|
|
1076
|
+
def _lexical_direct_assertion_evidence(
|
|
1077
|
+
body_text: str,
|
|
1078
|
+
*,
|
|
1079
|
+
primitive_re: re.Pattern[str],
|
|
1080
|
+
ignored_names: frozenset[str],
|
|
1081
|
+
) -> AssertionEvidence:
|
|
1082
|
+
"""Lexical verdict (TS, and Python-on-syntax-error): a non-constant direct assertion.
|
|
1083
|
+
|
|
1084
|
+
For each primitive-assertion window, harvest GENUINE references via
|
|
1085
|
+
:func:`_rhs_reference_idents` (which already drops identifiers inside strings,
|
|
1086
|
+
comments, object keys, and member-property positions) and subtract
|
|
1087
|
+
``ignored_names``. If any window references a non-ignored name ⇒ ``direct``
|
|
1088
|
+
(ok). A window whose references cannot be confidently scanned (``None`` —
|
|
1089
|
+
unterminated string/comment) is SKIPPED so it can never manufacture a
|
|
1090
|
+
false-RED. Only when EVERY window is constant-only ⇒ ``constant_direct``.
|
|
1091
|
+
"""
|
|
1092
|
+
|
|
1093
|
+
saw_primitive = False
|
|
1094
|
+
for window in _primitive_assertion_windows(body_text, primitive_re):
|
|
1095
|
+
saw_primitive = True
|
|
1096
|
+
refs = _rhs_reference_idents(window)
|
|
1097
|
+
if refs is None:
|
|
1098
|
+
return AssertionEvidence(ok=True, reason="direct") # cannot scan ⇒ keep credit
|
|
1099
|
+
if refs - ignored_names:
|
|
1100
|
+
return AssertionEvidence(ok=True, reason="direct")
|
|
1101
|
+
if not saw_primitive:
|
|
1102
|
+
return AssertionEvidence(ok=True, reason="direct") # no window ⇒ keep credit
|
|
1103
|
+
return AssertionEvidence(ok=False, reason="constant_direct")
|
|
1104
|
+
|
|
1105
|
+
|
|
1106
|
+
def _typescript_direct_assertion_evidence(body_text: str) -> AssertionEvidence:
|
|
1107
|
+
"""TS/JS direct-assertion verdict — lexical, reusing the shared window scanner."""
|
|
1108
|
+
|
|
1109
|
+
return _lexical_direct_assertion_evidence(
|
|
1110
|
+
body_text,
|
|
1111
|
+
primitive_re=_TS_PRIMITIVE_ASSERT_RE,
|
|
1112
|
+
ignored_names=_TS_DIRECT_IGNORED_NAMES,
|
|
1113
|
+
)
|
|
1114
|
+
|
|
1115
|
+
|
|
738
1116
|
# ---------------------------------------------------------------------------
|
|
739
1117
|
# Shared helper-resolution machinery (language-agnostic skeleton; the per-
|
|
740
1118
|
# profile adapters supply the regexes/extensions for their stack).
|
|
@@ -829,6 +1207,40 @@ def _python_decorator_start_lines(text: str) -> dict[int, int]:
|
|
|
829
1207
|
return starts
|
|
830
1208
|
|
|
831
1209
|
|
|
1210
|
+
def _python_test_function_nodes(
|
|
1211
|
+
text: str,
|
|
1212
|
+
) -> list[ast.FunctionDef | ast.AsyncFunctionDef]:
|
|
1213
|
+
"""Top-level ``test_*`` functions (module- or class-level) via AST.
|
|
1214
|
+
|
|
1215
|
+
AST is signature-layout-agnostic, so a multi-line ``def test_x(\n a,\n) -> None:``
|
|
1216
|
+
yields the CORRECT body extent — unlike the legacy line-scanner, which read the
|
|
1217
|
+
closing ``)`` line (at the def's own indent) as the body dedent and collapsed
|
|
1218
|
+
the body to the parameter-annotation lines (the ``no_assertion`` FALSE-RED this
|
|
1219
|
+
fixes). A ``test_*`` nested INSIDE another function is excluded (not a
|
|
1220
|
+
pytest-collected unit). Returns [] on syntax error (caller falls back to the
|
|
1221
|
+
line-scanner).
|
|
1222
|
+
"""
|
|
1223
|
+
|
|
1224
|
+
try:
|
|
1225
|
+
tree = ast.parse(text)
|
|
1226
|
+
except (SyntaxError, ValueError):
|
|
1227
|
+
return []
|
|
1228
|
+
parents: dict[ast.AST, ast.AST] = {}
|
|
1229
|
+
for parent in ast.walk(tree):
|
|
1230
|
+
for child in ast.iter_child_nodes(parent):
|
|
1231
|
+
parents[child] = parent
|
|
1232
|
+
nodes: list[ast.FunctionDef | ast.AsyncFunctionDef] = []
|
|
1233
|
+
for node in ast.walk(tree):
|
|
1234
|
+
if not isinstance(node, (ast.FunctionDef, ast.AsyncFunctionDef)):
|
|
1235
|
+
continue
|
|
1236
|
+
if not str(node.name).startswith("test_"):
|
|
1237
|
+
continue
|
|
1238
|
+
if not isinstance(parents.get(node), (ast.Module, ast.ClassDef)):
|
|
1239
|
+
continue
|
|
1240
|
+
nodes.append(node)
|
|
1241
|
+
return sorted(nodes, key=lambda n: int(n.lineno))
|
|
1242
|
+
|
|
1243
|
+
|
|
832
1244
|
@dataclass(frozen=True)
|
|
833
1245
|
class PythonTestBlockProfile:
|
|
834
1246
|
"""pytest / unittest structural adapter.
|
|
@@ -847,6 +1259,48 @@ class PythonTestBlockProfile:
|
|
|
847
1259
|
return rel_path.endswith(".py")
|
|
848
1260
|
|
|
849
1261
|
def parse_test_blocks(self, text: str) -> list[TestBlock]:
|
|
1262
|
+
# AST is the authoritative body-extent source. The legacy line-scanner
|
|
1263
|
+
# (kept as a fallback for syntactically-invalid files) mis-reads a
|
|
1264
|
+
# MULTI-LINE def signature: the closing ``) -> None:`` sits at the def's
|
|
1265
|
+
# own indent, so it was taken as the body dedent and the body collapsed to
|
|
1266
|
+
# the parameter-annotation lines (a ``no_assertion`` FALSE-RED on a test
|
|
1267
|
+
# that genuinely asserts). AST yields the true ``body[0]..end_lineno``
|
|
1268
|
+
# extent regardless of signature layout, return annotation, decorators, or
|
|
1269
|
+
# nested defs. has_assertion stays the raw primitive check (unchanged).
|
|
1270
|
+
try:
|
|
1271
|
+
ast.parse(text)
|
|
1272
|
+
except (SyntaxError, ValueError):
|
|
1273
|
+
return self._parse_test_blocks_linescan(text)
|
|
1274
|
+
lines = text.splitlines()
|
|
1275
|
+
blocks: list[TestBlock] = []
|
|
1276
|
+
for node in _python_test_function_nodes(text):
|
|
1277
|
+
def_line = int(node.lineno)
|
|
1278
|
+
start_line = min(
|
|
1279
|
+
[int(d.lineno) for d in node.decorator_list], default=def_line
|
|
1280
|
+
)
|
|
1281
|
+
body_start = int(node.body[0].lineno) if node.body else def_line
|
|
1282
|
+
body_end = int(getattr(node, "end_lineno", body_start) or body_start)
|
|
1283
|
+
body_text = "\n".join(lines[body_start - 1 : body_end])
|
|
1284
|
+
skipped = bool(re.search(r"\bpytest\.skip\s*\(", body_text)) or bool(
|
|
1285
|
+
re.search(r"\bself\.skipTest\s*\(", body_text)
|
|
1286
|
+
)
|
|
1287
|
+
decorator_text = "\n".join(lines[start_line - 1 : def_line - 1])
|
|
1288
|
+
if _PY_SKIP_DECORATOR_RE.search(decorator_text):
|
|
1289
|
+
skipped = True
|
|
1290
|
+
has_assertion = bool(_PY_PRIMITIVE_ASSERT_RE.search(body_text))
|
|
1291
|
+
blocks.append(
|
|
1292
|
+
TestBlock(
|
|
1293
|
+
start_line=start_line,
|
|
1294
|
+
end_line=body_end,
|
|
1295
|
+
is_executable=not skipped,
|
|
1296
|
+
has_assertion=has_assertion,
|
|
1297
|
+
label=node.name,
|
|
1298
|
+
body_text=body_text,
|
|
1299
|
+
)
|
|
1300
|
+
)
|
|
1301
|
+
return blocks
|
|
1302
|
+
|
|
1303
|
+
def _parse_test_blocks_linescan(self, text: str) -> list[TestBlock]:
|
|
850
1304
|
lines = text.splitlines()
|
|
851
1305
|
marker_lines = _shared_marker_lines(text)
|
|
852
1306
|
decorator_starts = _python_decorator_start_lines(text)
|
|
@@ -921,6 +1375,15 @@ class PythonTestBlockProfile:
|
|
|
921
1375
|
block, importer_text=importer_text, importer_rel=importer_rel, project_root=project_root
|
|
922
1376
|
)
|
|
923
1377
|
|
|
1378
|
+
def resolve_direct_assertion_evidence(self, block: TestBlock) -> AssertionEvidence:
|
|
1379
|
+
"""Whether the block's DIRECT primitive assertion references a real name.
|
|
1380
|
+
|
|
1381
|
+
AST-based (``constant_direct`` when the assertion is constant-only). Called
|
|
1382
|
+
by the gate only when ``block.has_assertion`` is True.
|
|
1383
|
+
"""
|
|
1384
|
+
|
|
1385
|
+
return _python_direct_assertion_evidence(block.body_text)
|
|
1386
|
+
|
|
924
1387
|
|
|
925
1388
|
# vitest/jest: it(...) / test(...) blocks; describe(...) groups. Skip via
|
|
926
1389
|
# ``.skip`` / ``.todo`` / ``xit`` / ``xtest`` / ``it.skipIf`` and a
|
|
@@ -1048,6 +1511,15 @@ class TypeScriptTestBlockProfile:
|
|
|
1048
1511
|
block, importer_text=importer_text, importer_rel=importer_rel, project_root=project_root
|
|
1049
1512
|
)
|
|
1050
1513
|
|
|
1514
|
+
def resolve_direct_assertion_evidence(self, block: TestBlock) -> AssertionEvidence:
|
|
1515
|
+
"""Whether the block's DIRECT primitive assertion references a real name.
|
|
1516
|
+
|
|
1517
|
+
Lexical (``constant_direct`` when the assertion is constant-only). Called
|
|
1518
|
+
by the gate only when ``block.has_assertion`` is True.
|
|
1519
|
+
"""
|
|
1520
|
+
|
|
1521
|
+
return _typescript_direct_assertion_evidence(block.body_text)
|
|
1522
|
+
|
|
1051
1523
|
@staticmethod
|
|
1052
1524
|
def _matching_close(lines: list[str], open_index: int) -> int:
|
|
1053
1525
|
"""1-based line of the brace that closes the block opened at ``open_index``.
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|