drift-analyzer 2.6.2__tar.gz → 2.7.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.
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.github/copilot-instructions.md +21 -0
- drift_analyzer-2.7.0/.github/prompts/drift-fix-loop.prompt.md +144 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.github/skills/drift-effective-usage/SKILL.md +27 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.pre-commit-config.yaml +1 -1
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/CHANGELOG.md +4 -1
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/CITATION.cff +2 -2
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/CONTRIBUTING.md +53 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/PKG-INFO +2 -2
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/README.md +1 -1
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/benchmarks/corpus/.drift-cache-golden/history.json +7 -7
- drift_analyzer-2.7.0/decisions/ADR-026-a2a-agent-card-http-serve.md +72 -0
- drift_analyzer-2.7.0/decisions/ADR-027-finding-status-for-suppression-transparency.md +49 -0
- drift_analyzer-2.7.0/decisions/ADR-028-analyzer-warning-channel.md +86 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/docs/STUDY.md +7 -2
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/docs-site/getting-started/quickstart.md +27 -3
- drift_analyzer-2.7.0/docs-site/javascripts/prove-viewer.js +657 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/docs-site/prove-it.md +60 -43
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/docs-site/stylesheets/drift.css +108 -1
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/drift.schema.json +22 -3
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/llms.txt +1 -1
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/overrides/home.html +14 -37
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/pyproject.toml +1 -1
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/api.py +79 -29
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/api_helpers.py +10 -10
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/baseline.py +2 -2
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/cache.py +1 -1
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/cli.py +58 -3
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/commands/check.py +161 -91
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/commands/explain.py +59 -51
- drift_analyzer-2.7.0/src/drift/commands/precision_cmd.py +190 -0
- drift_analyzer-2.7.0/src/drift/commands/serve.py +49 -0
- drift_analyzer-2.7.0/src/drift/commands/start.py +23 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/config.py +67 -33
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/copilot_context.py +6 -2
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/errors.py +4 -1
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/guardrails.py +8 -8
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/incremental.py +4 -4
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/mcp_server.py +51 -23
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/models.py +24 -5
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/negative_context.py +19 -18
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/negative_context_export.py +4 -4
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/output/agent_tasks.py +7 -7
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/output/csv_output.py +1 -1
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/output/github_format.py +1 -1
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/output/json_output.py +20 -10
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/output/rich_output.py +6 -5
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/pipeline.py +3 -0
- drift_analyzer-2.7.0/src/drift/plugins.py +171 -0
- drift_analyzer-2.6.2/tests/test_precision_recall.py → drift_analyzer-2.7.0/src/drift/precision.py +118 -117
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/recommendations.py +2 -1
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/scoring/engine.py +17 -17
- drift_analyzer-2.7.0/src/drift/serve/__init__.py +6 -0
- drift_analyzer-2.7.0/src/drift/serve/a2a_router.py +255 -0
- drift_analyzer-2.7.0/src/drift/serve/agent_card.py +146 -0
- drift_analyzer-2.7.0/src/drift/serve/app.py +109 -0
- drift_analyzer-2.7.0/src/drift/serve/models.py +77 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/session.py +36 -1
- drift_analyzer-2.7.0/src/drift/signal_registry.py +256 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/signals/architecture_violation.py +1 -1
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/signals/base.py +13 -2
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/signals/temporal_volatility.py +7 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/suppression.py +6 -2
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/trend_history.py +1 -1
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/fixtures/ground_truth.py +541 -1
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/golden/corpus_snapshot.json +260 -2
- drift_analyzer-2.7.0/tests/test_a2a_serve.py +243 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_agent_native_cli.py +16 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_cli_runtime.py +14 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_config.py +4 -3
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_config_validate.py +3 -1
- drift_analyzer-2.7.0/tests/test_eds_api_corresponding_tests.py +83 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_fix_actionability.py +4 -4
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_json_output.py +24 -1
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_output_golden.py +4 -0
- drift_analyzer-2.7.0/tests/test_plugin_api.py +263 -0
- drift_analyzer-2.7.0/tests/test_precision_recall.py +111 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_scan_diversity.py +100 -1
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_session.py +42 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_smoke_real_repos.py +1 -1
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_suppression.py +4 -0
- drift_analyzer-2.6.2/docs-site/javascripts/prove-viewer.js +0 -331
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.detect-secrets.cfg +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.devcontainer/devcontainer.json +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.dockerignore +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.drift-baseline.json +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.githooks/commit-msg +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.githooks/pre-commit +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.githooks/pre-push +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.github/AGENTS.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.github/CODEOWNERS +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.github/DISCUSSION_TEMPLATE/ideas.yml +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.github/DISCUSSION_TEMPLATE/questions.yml +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.github/FUNDING.yml +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.github/ISSUE_TEMPLATE/contribution_proposal.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.github/ISSUE_TEMPLATE/doc_drift.yml +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.github/ISSUE_TEMPLATE/false_positive.yml +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.github/ISSUE_TEMPLATE/good_first_issue.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.github/ISSUE_TEMPLATE/study_finding_rating.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.github/ISSUE_TEMPLATE/study_repo_benchmark.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.github/ISSUE_TEMPLATE/study_self_analysis.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.github/dependabot.yml +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.github/instructions/drift-policy.instructions.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.github/instructions/drift-push-gates.instructions.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.github/instructions/drift-quality-workflow.instructions.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.github/instructions/drift-release-automation.instructions.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.github/instructions/drift-release-mandatory.instructions.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.github/labeler.yml +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.github/labels.yml +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.github/prompts/PR-Orchestrator.prompt.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.github/prompts/README.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.github/prompts/_partials/bewertungs-taxonomie.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.github/prompts/_partials/issue-filing-external.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.github/prompts/_partials/issue-filing.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.github/prompts/_partials/konventionen.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.github/prompts/drift-agent-ux.prompt.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.github/prompts/drift-agent-workflow-test.prompt.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.github/prompts/drift-ai-integration.prompt.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.github/prompts/drift-ci-gate.prompt.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.github/prompts/drift-onboarding.prompt.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.github/prompts/drift-signal-quality.prompt.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.github/prompts/field-tests/README.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.github/prompts/field-tests/drift-context-eval.prompt.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.github/prompts/field-tests/drift-field-test.prompt.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.github/prompts/field-tests/drift-finding-audit.prompt.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.github/prompts/release.prompt.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.github/release-drafter.yml +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.github/repo-guard.blocklist +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.github/repo-root-allowlist +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.github/skills/drift-adr-workflow/SKILL.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.github/skills/drift-agent-prompt-authoring/SKILL.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.github/skills/drift-commit-push/SKILL.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.github/skills/drift-ground-truth-fixture-development/SKILL.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.github/skills/drift-pr-review/SKILL.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.github/skills/drift-release/SKILL.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.github/skills/drift-risk-audit-artifact-updates/SKILL.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.github/skills/drift-security-triage/SKILL.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.github/skills/drift-signal-development-full-lifecycle/SKILL.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.github/skills/gif-creation/SKILL.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.github/skills/gif-creation/references/windows-gif-workflow.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.github/skills/posthog-analytics/SKILL.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.github/skills/posthog-analytics/references/posthog-implementation.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.github/skills/svg-distribution-design/SKILL.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.github/skills/svg-distribution-design/references/distribution-svg-guidelines.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.github/workflows/README.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.github/workflows/ci.yml +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.github/workflows/codeql.yml +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.github/workflows/dependency-review.yml +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.github/workflows/doc-consistency.yml +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.github/workflows/docker.yml +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.github/workflows/docs.yml +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.github/workflows/fp-oracle-audit.yml +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.github/workflows/install-smoke.yml +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.github/workflows/labeler.yml +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.github/workflows/labels-sync.yml +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.github/workflows/package-kpis.yml +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.github/workflows/perf-regression-loop.yml +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.github/workflows/publish.yml +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.github/workflows/release.yml +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.github/workflows/repo-guard.yml +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.github/workflows/security-hygiene.yml +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.github/workflows/stale.yml +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.github/workflows/validate-release.yml +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.github/workflows/welcome.yml +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.github/workflows/workflow-sanity.yml +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.gitignore +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.markdownlint-cli2.jsonc +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.pre-commit-hooks.yaml +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.secrets.baseline +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.shellcheckrc +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.vscode/mcp.json +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.vscode/settings.json +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/.vscode/tasks.json +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/CODE_OF_CONDUCT.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/DEVELOPER.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/Dockerfile +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/Formula/drift-analyzer.rb +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/LICENSE +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/Makefile +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/POLICY.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/ROADMAP.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/SECURITY.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/SUPPORT.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/action.yml +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/benchmarks/corpus/.drift-cache-golden/parse/01611cd8233f2aa70c571f9e8c4ebdc2.json +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/benchmarks/corpus/.drift-cache-golden/parse/1e7cd9a98b3290c41e5e10dec26e35ea.json +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/benchmarks/corpus/.drift-cache-golden/parse/1f2d1a22e9791d9b2f3078612aa0f786.json +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/benchmarks/corpus/.drift-cache-golden/parse/226ac9d816e43df5ddc2a1f105ddc628.json +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/benchmarks/corpus/.drift-cache-golden/parse/2a5d4c9a80c6ea7a6d71ccf7c05c4ad2.json +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/benchmarks/corpus/.drift-cache-golden/parse/2baf118e8a0d13742b95d19cfcfa2e02.json +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/benchmarks/corpus/.drift-cache-golden/parse/3ea99d008b13c9720d79eb1aa60ee1ee.json +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/benchmarks/corpus/.drift-cache-golden/parse/4a8a215b34caf38fa4855682a7e35be5.json +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/benchmarks/corpus/.drift-cache-golden/parse/59d0360c97970456beb61a677362a68a.json +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/benchmarks/corpus/.drift-cache-golden/parse/5e610090f38b99b552831f348dfbdfff.json +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/benchmarks/corpus/.drift-cache-golden/parse/6186fe9a4dbfaeaef44654495863e533.json +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/benchmarks/corpus/.drift-cache-golden/parse/78756d46421bd849ad69b53db46cd81b.json +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/benchmarks/corpus/.drift-cache-golden/parse/cb6867a7470df13c2227fef55eb91904.json +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/benchmarks/corpus/.drift-cache-golden/parse/ce1b0ac9777a398ce99594f664bcd978.json +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/benchmarks/corpus/.drift-cache-golden/parse/d784163017a2693256dad9b1540716ae.json +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/benchmarks/corpus/.drift-cache-golden/parse/e174dbe14bbe023518432fa603b5f4b1.json +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/benchmarks/corpus/.drift-cache-golden/parse/e3b0c44298fc1c149afbf4c8996fb924.json +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/benchmarks/corpus/.drift-cache-golden/parse/e6c7265a3e1a5c08fcae73860b077763.json +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/benchmarks/corpus/.drift-cache-golden/parse/e914253ffba0b698dc7b3ca2da261100.json +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/benchmarks/corpus/.drift-cache-golden/parse/ec975ed99470aaa822b6caf0fa31ffc6.json +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/benchmarks/corpus/.drift-cache-golden/signals/architecture_violation_4b0be3363be6ee8a_e2453b10bd54639f593783c294ce3751.json +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/benchmarks/corpus/.drift-cache-golden/signals/broad_exception_monoculture_4b0be3363be6ee8a_e2453b10bd54639f593783c294ce3751.json +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/benchmarks/corpus/.drift-cache-golden/signals/bypass_accumulation_4b0be3363be6ee8a_e2453b10bd54639f593783c294ce3751.json +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/benchmarks/corpus/.drift-cache-golden/signals/circular_import_4b0be3363be6ee8a_e2453b10bd54639f593783c294ce3751.json +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/benchmarks/corpus/.drift-cache-golden/signals/co_change_coupling_4b0be3363be6ee8a_e2453b10bd54639f593783c294ce3751.json +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/benchmarks/corpus/.drift-cache-golden/signals/cognitive_complexity_4b0be3363be6ee8a_e2453b10bd54639f593783c294ce3751.json +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/benchmarks/corpus/.drift-cache-golden/signals/cohesion_deficit_4b0be3363be6ee8a_e2453b10bd54639f593783c294ce3751.json +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/benchmarks/corpus/.drift-cache-golden/signals/dead_code_accumulation_4b0be3363be6ee8a_e2453b10bd54639f593783c294ce3751.json +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/benchmarks/corpus/.drift-cache-golden/signals/doc_impl_drift_4b0be3363be6ee8a_e2453b10bd54639f593783c294ce3751.json +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/benchmarks/corpus/.drift-cache-golden/signals/exception_contract_drift_4b0be3363be6ee8a_e2453b10bd54639f593783c294ce3751.json +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/benchmarks/corpus/.drift-cache-golden/signals/explainability_deficit_4b0be3363be6ee8a_e2453b10bd54639f593783c294ce3751.json +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/benchmarks/corpus/.drift-cache-golden/signals/fan_out_explosion_4b0be3363be6ee8a_e2453b10bd54639f593783c294ce3751.json +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/benchmarks/corpus/.drift-cache-golden/signals/guard_clause_deficit_4b0be3363be6ee8a_e2453b10bd54639f593783c294ce3751.json +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/benchmarks/corpus/.drift-cache-golden/signals/hardcoded_secret_4b0be3363be6ee8a_e2453b10bd54639f593783c294ce3751.json +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/benchmarks/corpus/.drift-cache-golden/signals/insecure_default_4b0be3363be6ee8a_e2453b10bd54639f593783c294ce3751.json +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/benchmarks/corpus/.drift-cache-golden/signals/missing_authorization_4b0be3363be6ee8a_e2453b10bd54639f593783c294ce3751.json +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/benchmarks/corpus/.drift-cache-golden/signals/mutant_duplicate_4b0be3363be6ee8a_e2453b10bd54639f593783c294ce3751.json +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/benchmarks/corpus/.drift-cache-golden/signals/naming_contract_violation_4b0be3363be6ee8a_e2453b10bd54639f593783c294ce3751.json +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/benchmarks/corpus/.drift-cache-golden/signals/pattern_fragmentation_4b0be3363be6ee8a_e2453b10bd54639f593783c294ce3751.json +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/benchmarks/corpus/.drift-cache-golden/signals/system_misalignment_4b0be3363be6ee8a_e2453b10bd54639f593783c294ce3751.json +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/benchmarks/corpus/.drift-cache-golden/signals/temporal_volatility_4b0be3363be6ee8a_e2453b10bd54639f593783c294ce3751.json +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/benchmarks/corpus/.drift-cache-golden/signals/test_polarity_deficit_4b0be3363be6ee8a_e2453b10bd54639f593783c294ce3751.json +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/benchmarks/corpus/.drift-cache-golden/signals/ts_architecture_4b0be3363be6ee8a_e2453b10bd54639f593783c294ce3751.json +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/benchmarks/corpus/README.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/benchmarks/corpus/manifest.json +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/benchmarks/corpus/src/myapp/__init__.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/benchmarks/corpus/src/myapp/connectors/__init__.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/benchmarks/corpus/src/myapp/connectors/db.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/benchmarks/corpus/src/myapp/handler_v1.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/benchmarks/corpus/src/myapp/handler_v2.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/benchmarks/corpus/src/myapp/handlers/__init__.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/benchmarks/corpus/src/myapp/handlers/auth.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/benchmarks/corpus/src/myapp/handlers/orders.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/benchmarks/corpus/src/myapp/handlers/payments.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/benchmarks/corpus/src/myapp/handlers/shipping.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/benchmarks/corpus/src/myapp/models/__init__.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/benchmarks/corpus/src/myapp/models/core.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/benchmarks/corpus/src/myapp/models/enriched.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/benchmarks/corpus/src/myapp/outlier_module.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/benchmarks/corpus/src/myapp/processors/__init__.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/benchmarks/corpus/src/myapp/processors/pricing.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/benchmarks/corpus/src/myapp/processors/transform.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/benchmarks/corpus/src/myapp/processors/validator.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/benchmarks/corpus/src/myapp/service_a.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/benchmarks/corpus/src/myapp/service_b.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/benchmarks/corpus/src/myapp/utils/__init__.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/benchmarks/corpus/src/myapp/utils/formatting.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/benchmarks/corpus/src/myapp/utils/helpers.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/benchmarks/corpus/src/myapp/utils/naming.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/benchmarks/corpus/tests/__init__.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/benchmarks/corpus/tests/test_api.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/benchmarks/oracle_repos.json +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/conda.recipe/meta.yaml +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/decisions/ADR-010-finding-context-triage-policy.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/decisions/ADR-011-csv-output-format.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/decisions/ADR-012-copilot-context-actionability-pfs-nbv.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/decisions/ADR-013-scan-signal-filtering-and-per-signal-cap.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/decisions/ADR-014-mds-precision-first-scoring-readiness.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/decisions/ADR-016-security-signals-wave2-calibration.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/decisions/ADR-017-dia-false-positive-reduction.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/decisions/ADR-018-avs-co-change-precision-hardening.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/decisions/ADR-019-pfs-return-pattern-extraction.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/decisions/ADR-020-agent-fix-loop-optimization.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/decisions/ADR-021-batch-dominant-fix-loop-orchestration.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/decisions/ADR-022-mcp-session-management.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/decisions/ADR-023-canonical-examples-in-agent-output.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/decisions/ADR-024-next-step-contracts.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/decisions/ADR-025-orchestration-layer-workflow-plans-handoffs.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/decisions/ADR-025-task-queue-leasing.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/decisions/templates/README.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/decisions/templates/adr-template.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/decisions/templates/signal-design-template.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/docs/EPISTEMICS.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/docs/MAINTAINER_RUNBOOK.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/docs/OUTREACH.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/docs/PRODUCT_STRATEGY.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/docs/REPOSITORY_GOVERNANCE.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/docs/ROOT_POLICY.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/docs/adr/001-deterministic-analysis-pipeline.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/docs/adr/002-ast-fingerprinting-for-patterns.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/docs/adr/003-composite-scoring-model.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/docs/adr/004-subprocess-git-parsing.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/docs/adr/005-delta-first-score-interpretation.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/docs/adr/006-context-tagging.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/docs/adr/007-consistency-proxy-signals.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/docs/adr/008-intention-contract-proxy-signals.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/docs/distribution/README.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/docs/distribution/awesome-submissions.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/docs/distribution/channel-rules.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/docs/distribution/devto-hashnode-5-repos.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/docs/distribution/ide-discovery-mvp-spec.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/docs/distribution/website-post-checklist.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/docs/distribution/week1-rollout-runbook.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/docs/drift-architecture-erosion-analysis.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/docs/language-roadmap.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/docs/language-support-matrix.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/docs/migration.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/docs/python-baseline.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/docs/python-rule-inventory.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/docs-site/algorithms/deep-dive.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/docs-site/algorithms/scoring.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/docs-site/algorithms/signals.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/docs-site/assets/logo.svg +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/docs-site/assets/og-image.svg +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/docs-site/assets/readme-overview.svg +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/docs-site/benchmarking.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/docs-site/case-studies/django.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/docs-site/case-studies/fastapi.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/docs-site/case-studies/index.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/docs-site/case-studies/paramiko.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/docs-site/case-studies/pydantic.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/docs-site/changelog.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/docs-site/comparisons/drift-vs-architecture-conformance.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/docs-site/comparisons/drift-vs-ruff.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/docs-site/comparisons/drift-vs-semgrep-codeql.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/docs-site/comparisons/index.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/docs-site/contributing.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/docs-site/faq.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/docs-site/getting-started/configuration.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/docs-site/getting-started/finding-triage.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/docs-site/getting-started/installation.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/docs-site/getting-started/prompts.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/docs-site/getting-started/team-rollout.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/docs-site/getting-started/troubleshooting.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/docs-site/getting-started/vibe-coding-problems.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/docs-site/glossary.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/docs-site/index.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/docs-site/integrations.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/docs-site/product/example-findings.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/docs-site/product/press-brand.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/docs-site/product-strategy.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/docs-site/reference/api-outputs.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/docs-site/reference/negative-context.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/docs-site/reference/performance.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/docs-site/reference/signals/pfs.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/docs-site/stability.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/docs-site/start-here.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/docs-site/study.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/docs-site/trust-evidence.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/docs-site/use-cases/architectural-linter-ai-teams.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/docs-site/use-cases/architecture-drift-python.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/docs-site/use-cases/ci-architecture-checks-sarif.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/docs-site/use-cases/index.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/docs-site/use-cases/technical-debt-ai-codebases.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/drift.example.yaml +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/examples/demo-project/README.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/examples/demo-project/api/__init__.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/examples/demo-project/api/routes.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/examples/demo-project/db/__init__.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/examples/demo-project/db/models.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/examples/demo-project/services/__init__.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/examples/demo-project/services/email_service.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/examples/demo-project/services/order_service.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/examples/demo-project/services/user_service.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/examples/demo-project/utils/__init__.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/examples/demo-project/utils/validators.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/examples/demo_fastapi.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/examples/drift-check.yml +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/examples/package-kpis/README.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/examples/package-kpis/defects.csv +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/examples/package-kpis/kpi-thresholds.json +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/examples/package-kpis/usage.csv +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/examples/vibe-coding/README.md +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/examples/vibe-coding/claude_desktop_config.json +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/examples/vibe-coding/drift-gate.yml +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/examples/vibe-coding/drift.yaml +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/examples/vibe-coding/mcp.json +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/examples/vibe-coding/pre-push +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/examples/vibe-coding/setup-baseline.sh +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/examples/vibe-coding/weekly-check.sh +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/hooks/docs_version.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/mkdocs.yml +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/overrides/404.html +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/overrides/main.html +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/__init__.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/__main__.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/analyzer.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/analyzers/typescript/__init__.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/analyzers/typescript/_path_utils.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/analyzers/typescript/alias_resolver.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/analyzers/typescript/barrel_resolver.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/analyzers/typescript/import_graph.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/analyzers/typescript/shared.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/analyzers/typescript/workspace_boundaries.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/commands/__init__.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/commands/_io.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/commands/analyze.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/commands/badge.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/commands/baseline.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/commands/brief.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/commands/config_cmd.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/commands/copilot_context.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/commands/diff_cmd.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/commands/export_context.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/commands/fix_plan.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/commands/init_cmd.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/commands/mcp.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/commands/patterns.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/commands/scan.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/commands/self_analyze.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/commands/timeline.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/commands/trend.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/commands/validate_cmd.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/context_tags.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/embeddings.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/finding_context.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/ingestion/__init__.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/ingestion/ast_parser.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/ingestion/file_discovery.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/ingestion/git_history.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/ingestion/ts_parser.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/output/__init__.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/profiles.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/py.typed +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/rules/tsjs/circular_module_detection.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/rules/tsjs/cross_package_import_ban.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/rules/tsjs/layer_leak_detection.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/rules/tsjs/ui_to_infra_import_ban.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/scope_resolver.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/scoring/__init__.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/signals/__init__.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/signals/_utils.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/signals/broad_exception_monoculture.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/signals/bypass_accumulation.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/signals/circular_import.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/signals/co_change_coupling.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/signals/cognitive_complexity.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/signals/cohesion_deficit.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/signals/dead_code_accumulation.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/signals/doc_impl_drift.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/signals/exception_contract_drift.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/signals/explainability_deficit.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/signals/fan_out_explosion.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/signals/guard_clause_deficit.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/signals/hardcoded_secret.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/signals/insecure_default.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/signals/missing_authorization.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/signals/mutant_duplicates.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/signals/naming_contract_violation.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/signals/pattern_fragmentation.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/signals/system_misalignment.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/signals/test_polarity_deficit.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/signals/ts_architecture.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/telemetry.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/timeline.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/src/drift/types.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/__init__.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/conftest.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/fixtures/__init__.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/fixtures/study_samples/debt_correlation.json +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/fixtures/study_samples/rater_matrix.json +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/fixtures/study_samples/self_analysis_reports.json +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/fixtures/tsjs_alias_resolution/src/app.ts +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/fixtures/tsjs_alias_resolution/src/core/logger.ts +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/fixtures/tsjs_alias_resolution/src/shared/config.ts +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/fixtures/tsjs_alias_resolution/tsconfig.json +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/fixtures/tsjs_alias_resolution_extends/src/app.ts +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/fixtures/tsjs_alias_resolution_extends/src/base/logger.ts +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/fixtures/tsjs_alias_resolution_extends/src/leaf/feature.ts +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/fixtures/tsjs_alias_resolution_extends/src/mid/util.ts +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/fixtures/tsjs_alias_resolution_extends/src/override/config.ts +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/fixtures/tsjs_alias_resolution_extends/src/shared/config.ts +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/fixtures/tsjs_alias_resolution_extends/tsconfig.base.json +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/fixtures/tsjs_alias_resolution_extends/tsconfig.json +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/fixtures/tsjs_alias_resolution_extends/tsconfig.mid.json +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/fixtures/tsjs_barrel_resolution/src/app.ts +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/fixtures/tsjs_barrel_resolution/src/app_tsx.ts +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/fixtures/tsjs_barrel_resolution/src/button.tsx +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/fixtures/tsjs_barrel_resolution/src/index.ts +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/fixtures/tsjs_barrel_resolution/src/view/card.tsx +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/fixtures/tsjs_barrel_resolution/src/view/index.tsx +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/fixtures/tsjs_graph_relative/app.ts +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/fixtures/tsjs_graph_relative/components/button.tsx +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/fixtures/tsjs_graph_relative/components/index.ts +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/fixtures/tsjs_graph_relative/lib/util.ts +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/fixtures/tsjs_rule_cross_package/negative/cross_package_import_ban.json +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/fixtures/tsjs_rule_cross_package/negative/package.json +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/fixtures/tsjs_rule_cross_package/negative/packages/app/src/main.ts +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/fixtures/tsjs_rule_cross_package/negative/packages/ui/src/button.ts +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/fixtures/tsjs_rule_cross_package/positive/cross_package_import_ban.json +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/fixtures/tsjs_rule_cross_package/positive/package.json +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/fixtures/tsjs_rule_cross_package/positive/packages/app/src/main.ts +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/fixtures/tsjs_rule_cross_package/positive/packages/ui/src/button.ts +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/fixtures/tsjs_rule_cycles/negative/src/a.ts +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/fixtures/tsjs_rule_cycles/negative/src/b.ts +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/fixtures/tsjs_rule_cycles/positive/src/a.ts +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/fixtures/tsjs_rule_cycles/positive/src/b.ts +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/fixtures/tsjs_rule_layer_leak/negative/layer_leak_detection.json +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/fixtures/tsjs_rule_layer_leak/negative/src/infra/storage.ts +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/fixtures/tsjs_rule_layer_leak/negative/src/ui/view.ts +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/fixtures/tsjs_rule_layer_leak/positive/layer_leak_detection.json +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/fixtures/tsjs_rule_layer_leak/positive/src/infra/storage.ts +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/fixtures/tsjs_rule_layer_leak/positive/src/ui/view.ts +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/fixtures/tsjs_rule_ui_to_infra/negative/src/infra/storage.ts +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/fixtures/tsjs_rule_ui_to_infra/negative/src/ui/components/button.ts +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/fixtures/tsjs_rule_ui_to_infra/negative/src/ui/view.ts +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/fixtures/tsjs_rule_ui_to_infra/negative/ui_to_infra_import_ban.json +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/fixtures/tsjs_rule_ui_to_infra/positive/src/infra/storage.ts +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/fixtures/tsjs_rule_ui_to_infra/positive/src/ui/view.ts +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/fixtures/tsjs_rule_ui_to_infra/positive/ui_to_infra_import_ban.json +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/fixtures/tsjs_workspace_boundaries/package.json +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/fixtures/tsjs_workspace_boundaries/packages/app/src/main.ts +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/fixtures/tsjs_workspace_boundaries/packages/ui/src/button.tsx +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/fixtures/tsjs_workspace_boundaries/vite.config.ts +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/golden/corpus_snapshot.sarif +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_ablation.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_agent_tasks.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_ai_tool_indicators.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_analysis_degradation.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_analysis_edge_cases.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_architecture_violation.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_ast_parser.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_avs_enhanced.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_avs_missing_patterns_evidence.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_avs_mutations.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_badge_command.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_baseline.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_batch_metadata.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_benchmark_label_keys.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_benchmark_structure.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_brief.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_bypass_accumulation.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_cache_resilience.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_ci_reality.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_circular_import.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_co_change_coupling.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_cognitive_complexity.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_cohesion_deficit.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_compat.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_config_schema.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_consistency_proxies.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_console_scripts.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_context_tags.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_copilot_context_actionability.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_copilot_context_coverage.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_csv_output.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_dead_code_accumulation.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_delta_first.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_dia_enhanced.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_dx_features.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_embeddings.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_enterprise_governance_assets.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_exception_contract_drift.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_fan_out_explosion.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_fetch_github_usage.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_fetch_pypistats.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_file_discovery.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_finding_context.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_git_history_edge_cases.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_git_history_safety.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_golden_snapshot.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_guard_clause_deficit.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_hardcoded_secret.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_incremental.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_init_cmd.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_insecure_default.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_integration.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_issue_138_139_140.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_malformed_history.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_mcp_copilot.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_mcp_hardening.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_mirofish_signal_improvements.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_missing_authorization.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_model_consistency.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_module_entrypoint.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_mutant_duplicates_edge_cases.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_naming_contract_violation.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_negative_context.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_negative_context_export.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_nudge.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_orchestration_extensions.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_output_minimal_and_signal_labels.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_package_kpis.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_parse_file_resilience.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_path_overrides.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_pattern_fragmentation.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_patterns_command.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_pipeline_components.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_property_based.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_recommendations.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_recommendations_edge_cases.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_release_automation.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_release_discipline.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_repo_hygiene.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_rule_ids.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_sarif_contract.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_scope_resolver.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_scoring.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_scoring_edge_cases.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_self_command.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_signal_contract.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_signal_crash_guard.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_signal_thresholds.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_signal_utils.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_study_infrastructure.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_task_graph.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_task_queue.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_telemetry.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_test_polarity_deficit.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_timeline.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_timeline_command.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_trend_chart.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_trend_command_history.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_ts_signals_phase2.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_ts_signals_phase3.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_tsjs_alias_resolution.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_tsjs_barrel_resolution.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_tsjs_import_graph_relative.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_tsjs_rule_circular_module_detection.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_tsjs_rule_cross_package_import_ban.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_tsjs_rule_layer_leak_detection.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_tsjs_rule_ui_to_infra_import_ban.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_tsjs_workspace_boundaries.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_typescript_parser.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/tests/test_workspace_value.py +0 -0
- {drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/uv.lock +0 -0
|
@@ -193,6 +193,27 @@ python scripts/release_automation.py --full-release
|
|
|
193
193
|
|
|
194
194
|
---
|
|
195
195
|
|
|
196
|
+
## MCP Fix-Loop — Optimierter Workflow für Finding-Behebung
|
|
197
|
+
|
|
198
|
+
Wenn ein Agent Drift-Findings über MCP-Tools beheben soll, **muss** dieser Ablauf verwendet werden:
|
|
199
|
+
|
|
200
|
+
1. **`drift_session_start(path=".", autopilot=true)`** — ein Aufruf statt vier (bündelt validate + brief + scan + fix_plan)
|
|
201
|
+
2. **`drift_nudge(session_id=..., changed_files=...)`** — nach jeder Dateiänderung als schneller Inner-Loop (~0.2 s statt ~3 s für scan)
|
|
202
|
+
3. **`drift_fix_plan(session_id=..., max_tasks=1)`** — nächsten Task holen (immer `max_tasks=1`)
|
|
203
|
+
4. **`drift_diff(session_id=..., uncommitted=true)`** — nur einmal am Ende als Abschluss-Verifikation
|
|
204
|
+
|
|
205
|
+
**Verboten im Fix-Loop:**
|
|
206
|
+
- `drift_scan` nach jeder Dateiänderung (zu teuer, nutze `nudge`)
|
|
207
|
+
- `session_start` ohne `autopilot=true` (verschenkt 4 Roundtrips)
|
|
208
|
+
- `fix_plan` ohne `max_tasks=1` (unnötig große Responses)
|
|
209
|
+
- Tool-Aufrufe ohne `session_id` (verliert Kontext)
|
|
210
|
+
|
|
211
|
+
**Immer:** `agent_instruction` und `next_tool_call` aus Responses befolgen.
|
|
212
|
+
|
|
213
|
+
Vollständiger Workflow: `.github/prompts/drift-fix-loop.prompt.md`
|
|
214
|
+
|
|
215
|
+
---
|
|
216
|
+
|
|
196
217
|
## Schlussbestimmung
|
|
197
218
|
|
|
198
219
|
Diese Policy ist verbindlich (Policy §18).
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: "Drift Fix-Loop"
|
|
3
|
+
description: "Optimierter Agent-Workflow zum Beheben von Drift-Findings über MCP-Sessions. Nutzt session_start(autopilot=true) + nudge als Inner-Loop für minimale Roundtrips."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Drift Fix-Loop
|
|
7
|
+
|
|
8
|
+
Dieser Prompt beschreibt den optimalen Ablauf, um Drift-Findings in einem Workspace über MCP-Tools effizient zu beheben. Der Workflow minimiert Roundtrips und nutzt die vorhandene Session-Infrastruktur vollständig aus.
|
|
9
|
+
|
|
10
|
+
> **Pflicht:** Vor Ausführung dieses Prompts das Drift Policy Gate durchlaufen
|
|
11
|
+
> (siehe `.github/prompts/_partials/konventionen.md` und `.github/instructions/drift-policy.instructions.md`).
|
|
12
|
+
|
|
13
|
+
## Relevante Referenzen
|
|
14
|
+
|
|
15
|
+
- **Instruction:** `.github/instructions/drift-policy.instructions.md`
|
|
16
|
+
- **Push Gates:** `.github/instructions/drift-push-gates.instructions.md`
|
|
17
|
+
- **Skill:** `.github/skills/drift-effective-usage/SKILL.md`
|
|
18
|
+
- **Skill:** `.github/skills/drift-commit-push/SKILL.md`
|
|
19
|
+
- **MCP-Server:** `src/drift/mcp_server.py`
|
|
20
|
+
- **Session-Management:** `src/drift/session.py`
|
|
21
|
+
|
|
22
|
+
## Warum dieser Workflow
|
|
23
|
+
|
|
24
|
+
Ein naiver Agent-Loop ruft pro Finding: `validate → scan → fix_plan → [edit] → scan → diff` auf.
|
|
25
|
+
Jeder `scan`-Aufruf führt eine vollständige Repo-Analyse durch (~1–5 s). Bei mehreren Findings multipliziert sich die Wartezeit und die Roundtrips.
|
|
26
|
+
|
|
27
|
+
**Dieser Workflow reduziert das auf:**
|
|
28
|
+
1. Einen einzigen `session_start(autopilot=true)`-Aufruf (bündelt validate + brief + scan + fix_plan)
|
|
29
|
+
2. `nudge` als schnellen Inner-Loop nach jeder Dateiänderung (~0.2 s statt ~3 s für scan)
|
|
30
|
+
3. Einen einzigen `drift_diff` als Abschluss-Verifikation
|
|
31
|
+
|
|
32
|
+
## Ablauf
|
|
33
|
+
|
|
34
|
+
### Schritt 1 — Session starten mit Autopilot
|
|
35
|
+
|
|
36
|
+
```
|
|
37
|
+
drift_session_start(
|
|
38
|
+
path=".",
|
|
39
|
+
autopilot=true
|
|
40
|
+
)
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Dieser eine Aufruf führt automatisch `validate → brief → scan → fix_plan` aus und gibt die kombinierten Ergebnisse zurück. Die Session-ID wird in allen Folge-Aufrufen wiederverwendet.
|
|
44
|
+
|
|
45
|
+
**Wichtig:** Die `session_id` aus der Antwort merken und an **jeden** weiteren Tool-Aufruf übergeben.
|
|
46
|
+
|
|
47
|
+
### Schritt 2 — Ersten Task aus fix_plan bearbeiten
|
|
48
|
+
|
|
49
|
+
Die Autopilot-Antwort enthält bereits den `fix_plan`. Den **ersten** Task nehmen und umsetzen.
|
|
50
|
+
|
|
51
|
+
**Regel:** Immer nur einen Task gleichzeitig. Nicht mehrere Findings in einem Schritt mischen.
|
|
52
|
+
|
|
53
|
+
### Schritt 3 — Nach jeder Dateiänderung: nudge
|
|
54
|
+
|
|
55
|
+
```
|
|
56
|
+
drift_nudge(
|
|
57
|
+
session_id="<session_id>",
|
|
58
|
+
changed_files="<pfad/zur/geänderten/datei.py>"
|
|
59
|
+
)
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
`nudge` gibt schnelles Richtungsfeedback:
|
|
63
|
+
- `direction`: improving / stable / degrading
|
|
64
|
+
- `safe_to_commit`: true / false
|
|
65
|
+
- `confidence`: pro Signal
|
|
66
|
+
|
|
67
|
+
**Wenn `direction=degrading`:** Änderung rückgängig machen, anders lösen.
|
|
68
|
+
**Wenn `safe_to_commit=true`:** Weiter mit nächstem Task oder Abschluss.
|
|
69
|
+
|
|
70
|
+
### Schritt 4 — Nächsten Task holen (falls nötig)
|
|
71
|
+
|
|
72
|
+
Wenn weitere Findings offen sind:
|
|
73
|
+
|
|
74
|
+
```
|
|
75
|
+
drift_fix_plan(
|
|
76
|
+
session_id="<session_id>",
|
|
77
|
+
max_tasks=1
|
|
78
|
+
)
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
**Immer `max_tasks=1` verwenden.** Das reduziert die Response-Größe und den Parsing-Overhead erheblich.
|
|
82
|
+
|
|
83
|
+
Dann zurück zu Schritt 2.
|
|
84
|
+
|
|
85
|
+
### Schritt 5 — Abschluss-Verifikation
|
|
86
|
+
|
|
87
|
+
Erst wenn alle Tasks bearbeitet sind:
|
|
88
|
+
|
|
89
|
+
```
|
|
90
|
+
drift_diff(
|
|
91
|
+
session_id="<session_id>",
|
|
92
|
+
uncommitted=true
|
|
93
|
+
)
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
Prüfen:
|
|
97
|
+
- `resolved_count` > 0
|
|
98
|
+
- `new_count` == 0
|
|
99
|
+
- Keine Regressionen
|
|
100
|
+
|
|
101
|
+
## Zusammenfassung als Ablaufdiagramm
|
|
102
|
+
|
|
103
|
+
```
|
|
104
|
+
session_start(autopilot=true) ← 1 Aufruf statt 4
|
|
105
|
+
↓
|
|
106
|
+
fix_plan (in Autopilot enthalten)
|
|
107
|
+
↓
|
|
108
|
+
┌───────────────────────────┐
|
|
109
|
+
│ Task N bearbeiten │
|
|
110
|
+
│ Datei editieren │
|
|
111
|
+
│ nudge(changed_files=...) │ ← schnell (~0.2 s)
|
|
112
|
+
│ direction prüfen │
|
|
113
|
+
│ ggf. korrigieren │
|
|
114
|
+
└─────────┬─────────────────┘
|
|
115
|
+
│ safe_to_commit?
|
|
116
|
+
↓
|
|
117
|
+
fix_plan(max_tasks=1) ← nächster Task
|
|
118
|
+
│ keine Tasks mehr?
|
|
119
|
+
↓
|
|
120
|
+
drift_diff(uncommitted) ← Abschluss-Verifikation
|
|
121
|
+
↓
|
|
122
|
+
Commit vorbereiten
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
## Anti-Patterns: Was NICHT tun
|
|
126
|
+
|
|
127
|
+
| Anti-Pattern | Problem | Stattdessen |
|
|
128
|
+
|---|---|---|
|
|
129
|
+
| `drift_scan` nach jeder Dateiänderung | Volle Repo-Analyse pro Edit (~3–5 s) | `drift_nudge` verwenden (~0.2 s) |
|
|
130
|
+
| `session_start` ohne `autopilot=true` | 4 separate Roundtrips für validate/brief/scan/fix_plan | `autopilot=true` setzen |
|
|
131
|
+
| `fix_plan(max_tasks=5)` oder mehr | Große Response, Agent parst unnötig viel | `max_tasks=1` im Loop verwenden (initiale Übersicht wird von autopilot oder scan-Guidance gesteuert) |
|
|
132
|
+
| Kein `session_id` weitergeben | Jeder Aufruf verliert Kontext, kein Scope-Carry-Over | Immer `session_id` übergeben |
|
|
133
|
+
| `drift_diff` nach jedem Edit | Teurer als nötig für Zwischenfeedback | `nudge` als Inner-Loop, `diff` nur am Ende |
|
|
134
|
+
| Mehrere Findings gleichzeitig fixen | Unklar welche Änderung welchen Effekt hat | Immer ein Finding pro Iteration |
|
|
135
|
+
|
|
136
|
+
## Verhalten bei `agent_instruction` in Responses
|
|
137
|
+
|
|
138
|
+
Drift-MCP-Tools geben in jeder Antwort ein Feld `agent_instruction` zurück. **Dieses Feld befolgen.** Es enthält den empfohlenen nächsten Schritt, der zum Session-Zustand passt.
|
|
139
|
+
|
|
140
|
+
Zusätzlich gibt `next_tool_call` den konkreten nächsten Tool-Aufruf mit Parametern vor. Wenn vorhanden, diesen bevorzugt verwenden.
|
|
141
|
+
|
|
142
|
+
## Artefakte
|
|
143
|
+
|
|
144
|
+
Dieser Prompt erzeugt keine separaten Artefakte. Die Änderungen sind die Code-Fixes selbst.
|
|
@@ -156,6 +156,33 @@ Notes:
|
|
|
156
156
|
|
|
157
157
|
This sequence improves reliability and keeps agent actions policy-aligned.
|
|
158
158
|
|
|
159
|
+
### Optimized Fix-Loop (Session-Based)
|
|
160
|
+
|
|
161
|
+
For multi-finding fix workflows, use sessions to eliminate redundant scans:
|
|
162
|
+
|
|
163
|
+
```
|
|
164
|
+
# 1. Single call replaces validate + brief + scan + fix_plan
|
|
165
|
+
drift_session_start(path=".", autopilot=true)
|
|
166
|
+
|
|
167
|
+
# 2. Fix first task, then check with nudge (fast, ~0.2s)
|
|
168
|
+
drift_nudge(session_id="<sid>", changed_files="src/foo.py")
|
|
169
|
+
|
|
170
|
+
# 3. Get next task (always max_tasks=1 to keep responses small)
|
|
171
|
+
drift_fix_plan(session_id="<sid>", max_tasks=1)
|
|
172
|
+
|
|
173
|
+
# 4. After all tasks: verify once
|
|
174
|
+
drift_diff(session_id="<sid>", uncommitted=true)
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
Key rules:
|
|
178
|
+
- Always pass `session_id` to every subsequent tool call
|
|
179
|
+
- Use `nudge` (not `scan`) as inner-loop feedback after each edit
|
|
180
|
+
- Use `max_tasks=1` in fix_plan to reduce response size
|
|
181
|
+
- Follow `agent_instruction` and `next_tool_call` fields in responses
|
|
182
|
+
- Run `drift_diff` only as final verification, not after every edit
|
|
183
|
+
|
|
184
|
+
See `.github/prompts/drift-fix-loop.prompt.md` for the detailed workflow.
|
|
185
|
+
|
|
159
186
|
## False Positive Reduction Playbook
|
|
160
187
|
|
|
161
188
|
1. Confirm repository scope and excludes
|
|
@@ -19,7 +19,7 @@ repos:
|
|
|
19
19
|
rev: v1.5.0
|
|
20
20
|
hooks:
|
|
21
21
|
- id: detect-secrets
|
|
22
|
-
exclude: "(^|/)(tests/test_hardcoded_secret\\.py|tests/test_insecure_default\\.py|tests/golden/corpus_snapshot\\.json|src/drift/negative_context\\.py|\\.github/instructions/drift-release-automation\\.instructions\\.md)$"
|
|
22
|
+
exclude: "(^|/)(tests/test_hardcoded_secret\\.py|tests/test_insecure_default\\.py|tests/golden/corpus_snapshot\\.json|src/drift/negative_context\\.py|\\.github/instructions/drift-release-automation\\.instructions\\.md|\\.drift-baseline\\.json)$"
|
|
23
23
|
args:
|
|
24
24
|
- --baseline
|
|
25
25
|
- .secrets.baseline
|
|
@@ -2,12 +2,15 @@
|
|
|
2
2
|
|
|
3
3
|
### Added
|
|
4
4
|
|
|
5
|
+
- Add A2A Agent Card and HTTP serve endpoint (`drift serve`) for agent discovery in multi-agent systems (ADR-026). Exposes `GET /.well-known/agent-card.json` and `POST /a2a/v1` JSON-RPC 2.0 endpoint with 8 core analysis skills. Optional: `pip install drift-analyzer[serve]`.
|
|
5
6
|
- Add machine-readable next-step contracts (`next_tool_call`, `fallback_tool_call`, `done_when`) to all agent-oriented API responses (scan detailed, diff, fix_plan, nudge, brief, negative_context), plus `recovery_tool_call` on error responses, reducing agent hallucinations in tool-call chains (ADR-024).
|
|
6
7
|
- Add `preferred_pattern` field to guardrails and `canonical_refs` list to fix_plan tasks, surfacing positive code references (canonical exemplars, preferred patterns) from existing analysis data so coding agents receive concrete "do this" guidance alongside anti-patterns (ADR-023).
|
|
7
8
|
- Add `--exclude-signals` / `--exclude` option to `drift scan` CLI, `exclude_signals` parameter to the API, and MCP `drift_scan` tool to let callers explicitly exclude dominant or noisy signals (e.g. `MDS`) from returned findings (#173).
|
|
8
9
|
|
|
9
10
|
### Fixed
|
|
10
11
|
|
|
12
|
+
- Add missing `response_profile` docstring entry in `drift_diff` MCP tool, fixing `test_catalog_parameters_have_descriptions` CI failure.
|
|
13
|
+
- Exclude `.drift-baseline.json` from `detect-secrets` scan — fingerprint hex strings are analysis hashes, not secrets.
|
|
11
14
|
- Deduplicate `include` glob patterns in `file_discovery.py` to prevent the same file from being processed and appended multiple times when it matches several include patterns; use lazy `glob()` iterator and reuse `relative_to()` result to reduce redundant I/O.
|
|
12
15
|
- Pass `active_signals` directly to `create_signals()` for early pre-instantiation filtering; add `_SIGNAL_TYPE_VALUE_CACHE` in `signals/base.py` to avoid repeated probe instantiation on the signal-type lookup hot path.
|
|
13
16
|
- Add short-lived in-process git history cache (TTL 120 s, 16-entry LRU) in `fetch_git_history()` to skip redundant `git log` parsing across rapid consecutive scans with unchanged commit history.
|
|
@@ -83,7 +86,7 @@
|
|
|
83
86
|
- Map git-root-relative paths to repo-relative paths in `analyze_diff` and `parse_git_history` so `--repo` on nested subdirectories no longer leaks parent-repo file scope (#117).
|
|
84
87
|
- `drift self` error guidance now suggests valid next actions (`drift scan`/`drift analyze`) instead of invalid `--repo` flag (#120).
|
|
85
88
|
|
|
86
|
-
## [2.6.
|
|
89
|
+
## [2.6.2] - 2026-04-09
|
|
87
90
|
|
|
88
91
|
Short version: Signal-filtering for scan, cross-validation fields, and false-positive reductions across multiple signals.
|
|
89
92
|
|
|
@@ -9,8 +9,8 @@ authors:
|
|
|
9
9
|
repository-code: "https://github.com/mick-gsk/drift"
|
|
10
10
|
url: "https://mick-gsk.github.io/drift/"
|
|
11
11
|
license: MIT
|
|
12
|
-
version: "2.6.
|
|
13
|
-
date-released: "2026-04-
|
|
12
|
+
version: "2.6.2"
|
|
13
|
+
date-released: "2026-04-08"
|
|
14
14
|
keywords:
|
|
15
15
|
- static-analysis
|
|
16
16
|
- architectural-drift
|
|
@@ -200,6 +200,59 @@ Signals must be:
|
|
|
200
200
|
- **LLM-free** — the core pipeline uses only AST analysis and statistics
|
|
201
201
|
- **Fast** — target < 500ms per 1 000 functions
|
|
202
202
|
|
|
203
|
+
## Adding ground-truth fixtures
|
|
204
|
+
|
|
205
|
+
Every signal must have ground-truth fixtures in `tests/fixtures/ground_truth.py`.
|
|
206
|
+
These fixtures drive automated precision/recall measurement via `drift precision`.
|
|
207
|
+
|
|
208
|
+
### Fixture kinds
|
|
209
|
+
|
|
210
|
+
| Kind | Purpose | `should_detect` |
|
|
211
|
+
|------|---------|-----------------|
|
|
212
|
+
| `POSITIVE` | Clear true-positive — signal must fire | `True` |
|
|
213
|
+
| `NEGATIVE` | Clear true-negative — signal must not fire | `False` |
|
|
214
|
+
| `BOUNDARY` | Near detection threshold — tests edge behavior | either |
|
|
215
|
+
| `CONFOUNDER` | Looks like a TP but isn't — tests false-positive suppression | `False` |
|
|
216
|
+
|
|
217
|
+
### Minimum coverage per signal
|
|
218
|
+
|
|
219
|
+
| Kind | Required |
|
|
220
|
+
|------|----------|
|
|
221
|
+
| Positive (TP) | ≥ 2 |
|
|
222
|
+
| Negative (TN) | ≥ 2 |
|
|
223
|
+
| Boundary | ≥ 1 |
|
|
224
|
+
| Confounder | ≥ 1 |
|
|
225
|
+
|
|
226
|
+
No signal should ship without at least one TN fixture to prevent FP regressions.
|
|
227
|
+
|
|
228
|
+
### Workflow
|
|
229
|
+
|
|
230
|
+
1. Define a `GroundTruthFixture` in the signal's section of `ground_truth.py`
|
|
231
|
+
2. Add it to the `ALL_FIXTURES` list (or the `ALL_FIXTURES.extend(...)` block)
|
|
232
|
+
3. Run `drift precision --signal YOUR_SIGNAL` to verify detection
|
|
233
|
+
4. Run `pytest tests/test_precision_recall.py -k your_fixture_name` to validate
|
|
234
|
+
|
|
235
|
+
### Using `FileHistoryOverride`
|
|
236
|
+
|
|
237
|
+
Signals that depend on git history (TVS, SMS) need explicit history data.
|
|
238
|
+
Use `file_history_overrides` on the fixture:
|
|
239
|
+
|
|
240
|
+
```python
|
|
241
|
+
GroundTruthFixture(
|
|
242
|
+
name="tvs_example",
|
|
243
|
+
files={"app/hot.py": "def f(): pass"},
|
|
244
|
+
expected=[...],
|
|
245
|
+
file_history_overrides={
|
|
246
|
+
"app/hot.py": FileHistoryOverride(
|
|
247
|
+
total_commits=80,
|
|
248
|
+
change_frequency_30d=25.0,
|
|
249
|
+
),
|
|
250
|
+
},
|
|
251
|
+
)
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
Fields not set in the override use sensible defaults (see `precision.py:run_fixture`).
|
|
255
|
+
|
|
203
256
|
## Code conventions
|
|
204
257
|
|
|
205
258
|
- Python 3.11+, type annotations everywhere
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: drift-analyzer
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.7.0
|
|
4
4
|
Summary: Deterministic architectural drift detection for AI-accelerated Python repositories through cross-file coherence analysis
|
|
5
5
|
Project-URL: Homepage, https://mick-gsk.github.io/drift/
|
|
6
6
|
Project-URL: Repository, https://github.com/mick-gsk/drift
|
|
@@ -174,8 +174,8 @@ Comparison reflects primary design scope per [STUDY.md §9](docs/STUDY.md).
|
|
|
174
174
|
|
|
175
175
|
```bash
|
|
176
176
|
drift analyze --repo . # see your top findings
|
|
177
|
-
drift explain PFS # learn what a signal means
|
|
178
177
|
drift fix-plan --repo . # get actionable repair tasks
|
|
178
|
+
drift check --fail-on none # add report-only CI discipline
|
|
179
179
|
```
|
|
180
180
|
|
|
181
181
|
Add to CI (start report-only):
|
|
@@ -90,8 +90,8 @@ Comparison reflects primary design scope per [STUDY.md §9](docs/STUDY.md).
|
|
|
90
90
|
|
|
91
91
|
```bash
|
|
92
92
|
drift analyze --repo . # see your top findings
|
|
93
|
-
drift explain PFS # learn what a signal means
|
|
94
93
|
drift fix-plan --repo . # get actionable repair tasks
|
|
94
|
+
drift check --fail-on none # add report-only CI discipline
|
|
95
95
|
```
|
|
96
96
|
|
|
97
97
|
Add to CI (start report-only):
|
{drift_analyzer-2.6.2 → drift_analyzer-2.7.0}/benchmarks/corpus/.drift-cache-golden/history.json
RENAMED
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
[
|
|
2
2
|
{
|
|
3
|
-
"timestamp": "2026-04-
|
|
3
|
+
"timestamp": "2026-04-09T09:27:30.251368+00:00",
|
|
4
4
|
"drift_score": 0.373,
|
|
5
5
|
"signal_scores": {
|
|
6
|
-
"pattern_fragmentation": 0.1445,
|
|
7
6
|
"architecture_violation": 0.1145,
|
|
8
|
-
"
|
|
9
|
-
"
|
|
7
|
+
"cognitive_complexity": 0.5357,
|
|
8
|
+
"dead_code_accumulation": 0.8146,
|
|
10
9
|
"doc_impl_drift": 0.2435,
|
|
11
|
-
"
|
|
10
|
+
"explainability_deficit": 0.4673,
|
|
12
11
|
"guard_clause_deficit": 0.4698,
|
|
12
|
+
"mutant_duplicate": 0.8532,
|
|
13
13
|
"naming_contract_violation": 0.3469,
|
|
14
|
-
"
|
|
15
|
-
"
|
|
14
|
+
"pattern_fragmentation": 0.1445,
|
|
15
|
+
"test_polarity_deficit": 0.1734
|
|
16
16
|
},
|
|
17
17
|
"total_files": 26,
|
|
18
18
|
"total_findings": 64,
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: ADR-026
|
|
3
|
+
status: proposed
|
|
4
|
+
date: 2026-04-08
|
|
5
|
+
supersedes:
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# ADR-026: A2A Agent Card und HTTP-Serve-Endpunkt
|
|
9
|
+
|
|
10
|
+
## Kontext
|
|
11
|
+
|
|
12
|
+
Drift kommuniziert aktuell ausschließlich über stdio (MCP-Protokoll) und CLI. In Multi-Agenten-Systemen, die dem A2A-Standard (Agent-to-Agent Protocol v1.0) folgen, ist ein standardisiertes Discovery-Manifest (`/.well-known/agent-card.json`) erforderlich, damit Orchestratoren Drift automatisch erkennen und kontaktieren können. Ohne HTTP-Endpunkt ist kein A2A-Discovery möglich.
|
|
13
|
+
|
|
14
|
+
## Entscheidung
|
|
15
|
+
|
|
16
|
+
1. **Neuer optionaler HTTP-Server** via `drift serve` CLI-Subcommand.
|
|
17
|
+
Framework: FastAPI + uvicorn als optionale Dependencies (`pip install drift-analyzer[serve]`).
|
|
18
|
+
|
|
19
|
+
2. **Agent Card** unter `GET /.well-known/agent-card.json` nach A2A v1.0.
|
|
20
|
+
Exponiert 8 Kern-Analyse-Skills: scan, diff, explain, fix_plan, validate, nudge, brief, negative_context.
|
|
21
|
+
|
|
22
|
+
3. **A2A JSON-RPC 2.0 Endpunkt** unter `POST /a2a/v1`.
|
|
23
|
+
Skill-Dispatch via `skillId` in message metadata oder `skill`-Feld im data-Part.
|
|
24
|
+
|
|
25
|
+
4. **Security-Defaults**: Host `127.0.0.1` (localhost-only), kein Auth in v1.
|
|
26
|
+
Netzwerk-Exposure nur via explizitem `--host 0.0.0.0`.
|
|
27
|
+
|
|
28
|
+
5. **Kein Streaming** in v1 (`capabilities.streaming: false`).
|
|
29
|
+
|
|
30
|
+
### Was explizit nicht getan wird
|
|
31
|
+
|
|
32
|
+
- Session-Management- und Task-Queue-Tools (9 von 17 MCP-Tools) werden nicht als A2A-Skills exponiert.
|
|
33
|
+
- Kein Authentifizierungsmechanismus in v1 — Risk wird im STRIDE-Modell dokumentiert.
|
|
34
|
+
- Kein A2A Push-Notification-Support.
|
|
35
|
+
- Kein automatischer HTTPS/TLS — wird dem Deployment (Reverse Proxy) überlassen.
|
|
36
|
+
|
|
37
|
+
## Begründung
|
|
38
|
+
|
|
39
|
+
### Warum FastAPI + uvicorn (statt stdlib http.server)
|
|
40
|
+
|
|
41
|
+
- Typed request/response-Modelle via Pydantic (bereits Core-Dependency)
|
|
42
|
+
- OpenAPI-Schema erhalten Nutzer gratis
|
|
43
|
+
- FastAPI `TestClient` ermöglicht synchrone Tests ohne laufenden Server
|
|
44
|
+
- stdlib `http.server` bietet kein Typed Schema, keine async-Unterstützung, keine Middleware
|
|
45
|
+
|
|
46
|
+
### Warum JSON-RPC statt REST pro Skill
|
|
47
|
+
|
|
48
|
+
- A2A v1.0 spezifiziert JSON-RPC 2.0 als primäres Protokoll-Binding
|
|
49
|
+
- Ein einzelner `/a2a/v1`-Endpunkt mit Skill-Dispatch ist A2A-konform
|
|
50
|
+
- Separate REST-Routen pro Skill wären nicht A2A-kompatibel
|
|
51
|
+
|
|
52
|
+
### Warum nur 8 von 17 Tools
|
|
53
|
+
|
|
54
|
+
- Die 8 Kern-Analyse-Tools sind für Orchestratoren relevant (stateless Analyse)
|
|
55
|
+
- Session- und Task-Queue-Tools (9 weitere) sind MCP-spezifische Workflow-Hilfen, die im A2A-Kontext keinen Mehrwert bieten
|
|
56
|
+
- Erweiterbar in v2 falls Bedarf entsteht
|
|
57
|
+
|
|
58
|
+
## Konsequenzen
|
|
59
|
+
|
|
60
|
+
- **Neue optionale Dependencies**: `fastapi>=0.110.0,<1.0` und `uvicorn[standard]>=0.28.0` im `[serve]`-Extra.
|
|
61
|
+
- **Neuer Trust Boundary**: HTTP-Clients können über Netzwerk auf Drift-Analyse zugreifen. Default localhost-only mitigiert Remote-Exposure.
|
|
62
|
+
- **Repo-Path im Request**: A2A-Handler müssen Pfad-Validierung durchführen (Path-Traversal-Schutz).
|
|
63
|
+
- **STRIDE + Risk Register**: Pflicht-Updates unter `audit_results/` (Policy §18).
|
|
64
|
+
- **Kein Breaking Change**: Bestehende CLI und MCP-Nutzung bleiben unverändert; `serve` ist rein additiv.
|
|
65
|
+
|
|
66
|
+
## Validierung
|
|
67
|
+
|
|
68
|
+
- [ ] `pytest tests/test_a2a_serve.py` — alle Tests grün (Agent Card, JSON-RPC Dispatch, Fehlercodes)
|
|
69
|
+
- [ ] `curl http://localhost:8080/.well-known/agent-card.json` liefert valides A2A v1.0 JSON
|
|
70
|
+
- [ ] A2A JSON-RPC POST mit `scan`-Skill liefert korrekte Analyse-Antwort
|
|
71
|
+
- [ ] `mypy src/drift/serve/` + `ruff check` fehlerfrei
|
|
72
|
+
- [ ] `drift serve` ohne installiertes FastAPI zeigt Installations-Hinweis
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: ADR-027
|
|
3
|
+
status: proposed
|
|
4
|
+
date: 2026-04-08
|
|
5
|
+
supersedes:
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# ADR-027: Expliziter Finding-Status fuer Suppression-Transparenz
|
|
9
|
+
|
|
10
|
+
## Kontext
|
|
11
|
+
|
|
12
|
+
Drift blendet aktuell inline unterdrueckte Findings aus der primaeren Finding-Liste aus und zeigt nur einen Zaehler (`suppressed_count`). Dadurch kann in automatisierten Agenten-Workflows der Eindruck entstehen, dass Drift real reduziert wurde, obwohl Findings nur unterdrueckt wurden.
|
|
13
|
+
|
|
14
|
+
## Entscheidung
|
|
15
|
+
|
|
16
|
+
1. Wir fuehren additive Statusfelder auf `Finding` ein:
|
|
17
|
+
- `status` (`active`, `suppressed`, `resolved`)
|
|
18
|
+
- `status_set_by`
|
|
19
|
+
- `status_reason`
|
|
20
|
+
2. Inline-Suppressions markieren Findings explizit als `suppressed` mit Herkunft `inline_comment`.
|
|
21
|
+
3. `RepoAnalysis` traegt suppresste Findings in einer separaten Liste (`suppressed_findings`) fuer maschinenlesbare Transparenz.
|
|
22
|
+
4. JSON-Output erweitert sich additiv um:
|
|
23
|
+
- Statusfelder pro Finding
|
|
24
|
+
- `findings_suppressed` (nur Full-JSON)
|
|
25
|
+
- `compact_summary.suppressed_total`
|
|
26
|
+
|
|
27
|
+
### Was explizit nicht getan wird
|
|
28
|
+
|
|
29
|
+
- Keine Aenderung der Severity-Gate-Semantik in dieser Iteration.
|
|
30
|
+
- Kein neues Suppression-Policy-Format in dieser Iteration.
|
|
31
|
+
- Keine breaking schema changes; nur additive Felder.
|
|
32
|
+
|
|
33
|
+
## Begruendung
|
|
34
|
+
|
|
35
|
+
Die Trennung von `active` und `suppressed` ist die kleinste technisch robuste Aenderung, um False-Negative durch Suppression sichtbar zu machen, ohne bestehende Konsumenten zu brechen. Additive Felder erlauben schrittweise Adoption in CI und Agenten.
|
|
36
|
+
|
|
37
|
+
## Konsequenzen
|
|
38
|
+
|
|
39
|
+
- JSON-Schema-Minor wird auf `1.1` angehoben.
|
|
40
|
+
- Downstream-Consumer koennen weiterhin nur `findings` lesen; neue Transparenz ist opt-in.
|
|
41
|
+
- Grundlage fuer spaetere CI-Enforcement-Regeln (`no-new-suppressions`, Suppression-Budget) wird vorbereitet.
|
|
42
|
+
|
|
43
|
+
## Validierung
|
|
44
|
+
|
|
45
|
+
- [ ] `pytest tests/test_suppression.py -q --maxfail=1`
|
|
46
|
+
- [ ] `pytest tests/test_json_output.py -q --maxfail=1`
|
|
47
|
+
- [ ] `pytest tests/test_baseline.py -q --maxfail=1`
|
|
48
|
+
- [ ] `drift analyze --repo . --format json --exit-zero` enthaelt Statusfelder und `findings_suppressed`
|
|
49
|
+
- [ ] Lernzyklus-Ergebnis (Policy): bestaetigt | widerlegt | unklar | zurueckgestellt
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: ADR-028
|
|
3
|
+
status: proposed
|
|
4
|
+
date: 2026-04-09
|
|
5
|
+
supersedes:
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# ADR-028: Analyzer Warning Channel via BaseSignal Instance Field
|
|
9
|
+
|
|
10
|
+
## Kontext
|
|
11
|
+
|
|
12
|
+
`BaseSignal.analyze()` gibt `list[Finding]` zurück. Es existiert kein Mechanismus,
|
|
13
|
+
um Nicht-Finding-Informationen (z. B. "Signal wurde übersprungen, weil
|
|
14
|
+
Voraussetzungen fehlen") aus einem Signal herauszutransportieren.
|
|
15
|
+
|
|
16
|
+
Konkreter Auslöser: `TemporalVolatilitySignal` gibt bei leerem `file_histories`-Dict
|
|
17
|
+
still eine leere Liste zurück. Nutzer ohne `.git`-Verzeichnis oder mit flachem Clone
|
|
18
|
+
erhalten kein Feedback, warum TVS stumm bleibt.
|
|
19
|
+
|
|
20
|
+
## Entscheidung
|
|
21
|
+
|
|
22
|
+
Warnungen werden über ein Instanzfeld auf `BaseSignal` transportiert:
|
|
23
|
+
|
|
24
|
+
1. **Neues Dataclass `AnalyzerWarning`** in `drift/models.py`:
|
|
25
|
+
- `signal_type: str` — Quellsignal
|
|
26
|
+
- `message: str` — menschenlesbarer Text
|
|
27
|
+
- `skipped: bool = True` — ob das Signal übersprungen wurde
|
|
28
|
+
|
|
29
|
+
2. **`BaseSignal` erhält:**
|
|
30
|
+
- `_warnings: list[AnalyzerWarning]` (initialisiert in `__init__`)
|
|
31
|
+
- `emit_warning(message, *, skipped=True)` — Hilfsmethode zum Anhängen
|
|
32
|
+
|
|
33
|
+
3. **Engine/Runner** liest `signal._warnings` nach jedem `analyze()`-Aufruf
|
|
34
|
+
und sammelt sie zentral.
|
|
35
|
+
|
|
36
|
+
4. **CLI** gibt Warnungen als `⚠ Warning`-Zeilen nach der Finding-Ausgabe aus,
|
|
37
|
+
nicht als Findings.
|
|
38
|
+
|
|
39
|
+
### Was explizit nicht getan wird
|
|
40
|
+
|
|
41
|
+
- Keine Änderung der `analyze()`-Signatur
|
|
42
|
+
- Keine Breaking Change an `AnalysisContext`
|
|
43
|
+
- Kein neuer Rückgabetyp (z. B. `AnalysisResult(findings, warnings)`)
|
|
44
|
+
- Warnungen fließen nicht in Scoring oder Severity-Berechnung ein
|
|
45
|
+
|
|
46
|
+
## Begründung
|
|
47
|
+
|
|
48
|
+
### Verworfene Alternative: `AnalysisContext.warnings`
|
|
49
|
+
|
|
50
|
+
Signale erhalten keinen Context-Parameter in `analyze()`. Der Context müsste
|
|
51
|
+
über `bind_context()` gespeichert und in `analyze()` via `self._analysis_context`
|
|
52
|
+
zugänglich gemacht werden. Das erfordert Änderungen an allen bestehenden
|
|
53
|
+
`bind_context()`-Callsites und fügt dem Context weitere Verantwortlichkeiten
|
|
54
|
+
hinzu.
|
|
55
|
+
|
|
56
|
+
### Verworfene Alternative: Neuer Rückgabetyp
|
|
57
|
+
|
|
58
|
+
`analyze()` → `AnalysisResult(findings, warnings)` bricht alle bestehenden
|
|
59
|
+
Signal-Implementierungen und alle Callsites. Hoher Aufwand, geringer
|
|
60
|
+
Zusatznutzen gegenüber dem Instanzfeld.
|
|
61
|
+
|
|
62
|
+
### Gewählter Ansatz: Instanzfeld
|
|
63
|
+
|
|
64
|
+
- Kein Breaking Change
|
|
65
|
+
- Rückwärtskompatibel — Signale ohne Warnungen funktionieren unverändert
|
|
66
|
+
- Engine-Integration ist ein Einzeiler pro Signal-Aufruf
|
|
67
|
+
- Einfach testbar
|
|
68
|
+
|
|
69
|
+
## Konsequenzen
|
|
70
|
+
|
|
71
|
+
- Jedes Signal kann Warnungen emittieren, ohne API-Änderung
|
|
72
|
+
- Engine-Code muss nach `signal.analyze()` zusätzlich `signal._warnings` lesen
|
|
73
|
+
- Warnings accumulate pro Signal-Instanz; bei Wiederverwendung müsste `_warnings`
|
|
74
|
+
geleert werden (aktuell kein Anwendungsfall, da Instanzen pro Lauf erzeugt werden)
|
|
75
|
+
- Der precision-Runner und die CLI müssen Warnungen separat weiterreichen
|
|
76
|
+
|
|
77
|
+
## Validierung
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
# TVS emittiert Warning bei leerem file_histories
|
|
81
|
+
pytest tests/test_precision_recall.py -v -k tvs_new_file
|
|
82
|
+
# Neuer CLI-Befehl zeigt Warnungen
|
|
83
|
+
drift precision --signal TVS
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
Lernzyklus-Ergebnis: zurückgestellt (wird nach erstem Produktiveinsatz bewertet).
|
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
# STUDY.md — Evaluating Architectural Drift Detection in Real-World Python Projects
|
|
2
2
|
|
|
3
|
+
> **Baseline update (2026-04-09, v2.7 KPI Roadmap):** First full-model precision/recall baseline on the current 15-signal scoring model (14 scoring-active + TVS at weight 0.0). Ground-truth fixture suite expanded to 110 fixtures covering 16 signal types (was: 105 fixtures, 13 signals). **New coverage:** CCC (Co-Change Coupling) — TP/TN fixtures using injected CommitInfo data; COD (Cohesion Deficit) — boundary TN added (now ≥5 fixtures); ECM (Exception Contract Drift) — TN fixture (TP deferred: requires git-backed integration fixture). **Result:** All 16 evaluated signals at P=1.00 R=1.00 F1=1.00 on ground-truth fixtures; macro-average F1=1.00. Mutation benchmark: 17/17 = 100% recall (10/14 scoring signals covered). CI aggregate F1 gate raised from 0.50 → 0.60. CCC added to per-signal precision gates at 0.50. **Limitations:** Fixture P/R measures in-vitro signal correctness, not real-world precision on diverse codebases. Oracle-based precision (§3) remains at v0.5 baseline. Known gaps: ECM has 0 TP fixtures; CCC/ECM/COD/BAT/NBV missing mutation patterns. Evidence: `benchmark_results/v2.7.0_precision_recall_baseline.json`.
|
|
4
|
+
|
|
3
5
|
> **Versioning note (2026-04-05):** The package version in this repository is drift v2.5.4. Most quantitative benchmark artifacts referenced in this document were generated with drift v0.5.0 unless a later dated section states otherwise. The current production model exposes 23 configured signals, of which 15 are scoring-active and 8 remain report-only pending broader validation. This file therefore documents a historical evidence baseline and must not be read as a full description of the current live signal model. As of v2.5.0 the `scan` API and CLI command expose a `strategy` parameter (`diverse` / `top-severity`) that controls finding selection.
|
|
4
6
|
|
|
5
7
|
> **Feature update (2026-04-07, v2.5.4):** AVS `avs_co_change` precision hardening via FTA-driven three-MCS fix (ADR-018): self-analysis avs_co_change findings 20→0 (score 0.522→0.501, total findings 345→330). (1) Same-directory guard suppresses sister-file co-evolution in package directories; root-level pairs preserved. (2) `known_files` built from `filtered_prs` (consistent with import graph) eliminates test-source FPs. (3) Commit-size discount `1/(n-1)` in `build_co_change_pairs` reduces bulk/sweep-commit inflation. Mutation benchmark: AVS recall 100% (2/2), overall 94% (16/17). 5 regression tests added. Evidence: `benchmark_results/v2.5.4_avs_co_change_precision_hardening_feature_evidence.json`.
|
|
6
8
|
|
|
9
|
+
> **Feature update (2026-04-08):** Added A2A Agent Discovery support via `drift serve` (ADR-026): optional FastAPI/uvicorn HTTP server exposing `GET /.well-known/agent-card.json` (A2A v1.0 Agent Card) and `POST /a2a/v1` (JSON-RPC 2.0 dispatch) with 8 core skills (`scan`, `diff`, `explain`, `fix_plan`, `validate`, `nudge`, `brief`, `negative_context`). Security posture: localhost-only default bind (`127.0.0.1`), path normalization/validation in request router. Evidence: `benchmark_results/v2.7.0_a2a_agent_card_feature_evidence.json`; tests: `tests/test_a2a_serve.py` (15 passed).
|
|
10
|
+
|
|
7
11
|
> **Feature update (2026-04-07):** DIA FTA v2 eliminates all remaining self-analysis false positives (DIA findings 2→0 on own repo): (1) `_AUXILIARY_DIRS` extended with `artifacts` and `work_artifacts` to cover CI/build artifact and working directories; (2) illustrative path examples in ADR-017 moved from inline codespans to fenced code blocks so ADR scanning's `trust_codespans=True` no longer extracts them as phantom refs. FTA v2 root-cause chain: IE-4 (BE-8a) + IE-5a. 76/76 DIA unit tests green (3 new regression tests); 97/97 precision/recall fixtures unaffected. Evidence: `audit_results/risk_register.md` (RISK-SIG-2026-04-08-191).
|
|
8
12
|
|
|
9
13
|
> **Feature update (2026-04-05):** v2.5.0 extends `drift scan` with two agent-usability improvements. First, **signal filtering**: new `--exclude-signals` and `--max-per-signal` parameters on CLI, API, and MCP let callers suppress dominant signals or cap per-signal finding volume for balanced, token-efficient result lists (#173). ADR-013 documents the design decision. Second, **cross-validation fields**: all scan findings now include `signal_abbrev`, `signal_id`, `signal_type`, `severity_rank` (5=critical … 1=info), and a deterministic `fingerprint`; the response carries a top-level `cross_validation` block with field and score-range documentation for machine consumption (#171). DIA: suppress missing-README for bootstrap-sized repos (≤1 Python file). Evidence: `benchmark_results/v2.5.0_feature_evidence.json`; tests: `tests/test_scan_diversity.py`, `tests/test_agent_native_cli.py`, `tests/test_analysis_edge_cases.py`.
|
|
@@ -46,10 +50,11 @@
|
|
|
46
50
|
|
|
47
51
|
## Executive Summary
|
|
48
52
|
|
|
49
|
-
### Public Claims Safe To Repeat As Of 2026-
|
|
53
|
+
### Public Claims Safe To Repeat As Of 2026-04-09
|
|
50
54
|
|
|
51
55
|
- The package version in this repository is drift v2.5.4. The core benchmark corpus summarized below is the v0.5.0 evidence baseline.
|
|
52
56
|
- The v0.5 baseline composite score used 6 scoring signals. The current model exposes 23 configured signals, with 15 scoring-active and 8 report-only pending broader validation; quantitative precision/recall claims in this study apply only to the historical 6-signal model and have not been revalidated for the current live model.
|
|
57
|
+
- **v2.7 ground-truth baseline (2026-04-09):** 110 fixtures across 16 signal types yield P=1.00 R=1.00 F1=1.00 (macro) on the current 15-signal model. This measures in-vitro fixture correctness, not real-world oracle precision. Evidence: `benchmark_results/v2.7.0_precision_recall_baseline.json`.
|
|
53
58
|
- The current study corpus still covers 15 real-world repositories.
|
|
54
59
|
- All analysis is deterministic; no LLM is used in the detector pipeline.
|
|
55
60
|
|
|
@@ -92,7 +97,7 @@ $$S_i = \frac{\sum f_{ij}}{n_i} \cdot \min\!\left(1,\; \frac{\ln(1 + n_i)}{\ln(1
|
|
|
92
97
|
|
|
93
98
|
DIA, BEM, TPD, and GCD are included in the analysis output but contribute 0.0 to the composite score. They are Phase 2 signals with known precision limitations (see §3.1 for DIA; see [ADR-007](adr/007-consistency-proxy-signals.md) for BEM/TPD/GCD).
|
|
94
99
|
|
|
95
|
-
**Current codebase note (v2.
|
|
100
|
+
**Current codebase note (v2.7 baseline):** The live model exposes 23 configured signals, of which 14 are scoring-active (TVS weight reduced to 0.0) and 9 remain report-only. Ground-truth fixture evaluation (110 fixtures, 16 signal types) yields P=1.00 / R=1.00 / F1=1.00 macro-average. 10/14 scoring-active signals have mutation coverage (17/17 = 100% recall). The table above documents the v0.5 baseline only. See `benchmark_results/v2.7.0_precision_recall_baseline.json` for the full current-model baseline.
|
|
96
101
|
|
|
97
102
|
### 1.2 Repository Selection
|
|
98
103
|
|