drift-analyzer 2.7.0__tar.gz → 2.7.2__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.7.2/.github/ISSUE_TEMPLATE/real_repo_evaluation.yml +103 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.github/copilot-instructions.md +7 -5
- drift_analyzer-2.7.2/.github/instructions/drift-context-routing.instructions.md +40 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.github/instructions/drift-quality-workflow.instructions.md +2 -0
- drift_analyzer-2.7.2/.github/instructions/drift-release-mandatory.instructions.md +19 -0
- drift_analyzer-2.7.2/.github/prompts/_partials/review-checkliste.md +80 -0
- drift_analyzer-2.7.2/.github/prompts/drift-fix-loop.prompt.md +195 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.github/skills/drift-effective-usage/SKILL.md +34 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.github/skills/drift-pr-review/SKILL.md +6 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.secrets.baseline +2 -2
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/CHANGELOG.md +10 -1
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/CITATION.cff +2 -2
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/DEVELOPER.md +39 -1
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/PKG-INFO +1 -1
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/SECURITY.md +2 -1
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/benchmarks/corpus/.drift-cache-golden/history.json +1 -1
- drift_analyzer-2.7.2/benchmarks/corpus/.drift-cache-golden/parse/e3b0c44298fc1c149afbf4c8996fb924.json +1 -0
- drift_analyzer-2.7.2/benchmarks/corpus/.drift-cache-golden/signals/ts_architecture_0e43163985631ecc_e2453b10bd54639f593783c294ce3751.json +1 -0
- drift_analyzer-2.7.2/decisions/ADR-029-agent-effectiveness-features.md +78 -0
- drift_analyzer-2.7.2/decisions/ADR-029-preflight-diagnosis-and-markdown-report-export.md +72 -0
- drift_analyzer-2.7.2/decisions/ADR-030-cod-avs-eds-fp-reduction.md +115 -0
- drift_analyzer-2.7.2/decisions/ADR-031-agent-context-layer.md +75 -0
- drift_analyzer-2.7.2/decisions/ADR-032-hard-completion-gate-false-fix-relocation.md +66 -0
- drift_analyzer-2.7.2/decisions/ADR-033-phantom-reference-signal.md +107 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/docs/STUDY.md +29 -31
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/docs-site/algorithms/signals.md +3 -2
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/drift.example.yaml +15 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/drift.schema.json +360 -275
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/llms.txt +4 -3
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/pyproject.toml +1 -1
- drift_analyzer-2.7.2/src/drift/api/__init__.py +125 -0
- drift_analyzer-2.7.2/src/drift/api/_config.py +104 -0
- drift_analyzer-2.7.2/src/drift/api/_util.py +11 -0
- drift_analyzer-2.7.2/src/drift/api/brief.py +353 -0
- drift_analyzer-2.7.2/src/drift/api/diff.py +563 -0
- drift_analyzer-2.7.2/src/drift/api/drift_map_api.py +117 -0
- drift_analyzer-2.7.2/src/drift/api/explain.py +219 -0
- drift_analyzer-2.7.2/src/drift/api/fix_plan.py +470 -0
- drift_analyzer-2.7.2/src/drift/api/neg_context.py +134 -0
- drift_analyzer-2.7.2/src/drift/api/nudge.py +471 -0
- drift_analyzer-2.7.2/src/drift/api/scan.py +604 -0
- drift_analyzer-2.7.2/src/drift/api/validate.py +239 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/config.py +71 -2
- drift_analyzer-2.7.2/src/drift/finding_rendering.py +220 -0
- drift_analyzer-2.7.2/src/drift/mcp_catalog.py +170 -0
- drift_analyzer-2.7.2/src/drift/mcp_enrichment.py +133 -0
- drift_analyzer-2.7.2/src/drift/mcp_orchestration.py +724 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/mcp_server.py +238 -290
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/models.py +3 -0
- drift_analyzer-2.7.2/src/drift/negative_context/__init__.py +136 -0
- drift_analyzer-2.7.2/src/drift/negative_context/core.py +151 -0
- drift_analyzer-2.7.2/src/drift/negative_context/export.py +408 -0
- drift_analyzer-2.7.2/src/drift/negative_context/generators.py +1097 -0
- drift_analyzer-2.7.2/src/drift/next_step_contract.py +80 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/output/agent_tasks.py +10 -0
- drift_analyzer-2.7.2/src/drift/output/markdown_report.py +213 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/pipeline.py +10 -1
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/precision.py +51 -1
- drift_analyzer-2.7.2/src/drift/preflight.py +232 -0
- drift_analyzer-2.7.2/src/drift/quality_gate.py +112 -0
- drift_analyzer-2.7.2/src/drift/response_shaping.py +156 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/session.py +235 -0
- drift_analyzer-2.7.2/src/drift/signal_mapping.py +77 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/signal_registry.py +6 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/signals/__init__.py +2 -0
- drift_analyzer-2.7.2/src/drift/signals/phantom_reference.py +500 -0
- drift_analyzer-2.7.2/src/drift/situational_hints.py +174 -0
- drift_analyzer-2.7.2/src/drift/task_graph.py +688 -0
- drift_analyzer-2.7.2/src/drift/task_spec.py +206 -0
- drift_analyzer-2.7.2/src/drift/tool_metadata.py +273 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/fixtures/ground_truth.py +370 -5
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/golden/corpus_snapshot.json +2 -4
- drift_analyzer-2.7.2/tests/test_advisory_semantic.py +196 -0
- drift_analyzer-2.7.2/tests/test_agent_context_layer.py +272 -0
- drift_analyzer-2.7.2/tests/test_agent_effectiveness.py +271 -0
- drift_analyzer-2.7.2/tests/test_diagnostic_hypothesis_contract.py +225 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_mcp_hardening.py +114 -0
- drift_analyzer-2.7.2/tests/test_phantom_reference.py +377 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_plugin_api.py +9 -9
- drift_analyzer-2.7.2/tests/test_preflight_and_report.py +211 -0
- drift_analyzer-2.7.2/tests/test_quality_gate.py +83 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_scan_diversity.py +35 -57
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_signal_thresholds.py +2 -0
- drift_analyzer-2.7.2/tests/test_situational_hints.py +317 -0
- drift_analyzer-2.7.2/tests/test_task_spec.py +239 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_telemetry.py +13 -8
- drift_analyzer-2.7.2/tests/test_tool_metadata.py +99 -0
- drift_analyzer-2.7.0/.github/instructions/drift-release-mandatory.instructions.md +0 -38
- drift_analyzer-2.7.0/.github/prompts/drift-fix-loop.prompt.md +0 -144
- drift_analyzer-2.7.0/benchmarks/corpus/.drift-cache-golden/parse/e3b0c44298fc1c149afbf4c8996fb924.json +0 -1
- drift_analyzer-2.7.0/src/drift/api.py +0 -3031
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.detect-secrets.cfg +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.devcontainer/devcontainer.json +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.dockerignore +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.drift-baseline.json +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.githooks/commit-msg +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.githooks/pre-commit +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.githooks/pre-push +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.github/AGENTS.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.github/CODEOWNERS +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.github/DISCUSSION_TEMPLATE/ideas.yml +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.github/DISCUSSION_TEMPLATE/questions.yml +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.github/FUNDING.yml +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.github/ISSUE_TEMPLATE/contribution_proposal.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.github/ISSUE_TEMPLATE/doc_drift.yml +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.github/ISSUE_TEMPLATE/false_positive.yml +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.github/ISSUE_TEMPLATE/good_first_issue.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.github/ISSUE_TEMPLATE/study_finding_rating.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.github/ISSUE_TEMPLATE/study_repo_benchmark.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.github/ISSUE_TEMPLATE/study_self_analysis.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.github/dependabot.yml +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.github/instructions/drift-policy.instructions.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.github/instructions/drift-push-gates.instructions.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.github/instructions/drift-release-automation.instructions.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.github/labeler.yml +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.github/labels.yml +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.github/prompts/PR-Orchestrator.prompt.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.github/prompts/README.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.github/prompts/_partials/bewertungs-taxonomie.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.github/prompts/_partials/issue-filing-external.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.github/prompts/_partials/issue-filing.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.github/prompts/_partials/konventionen.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.github/prompts/drift-agent-ux.prompt.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.github/prompts/drift-agent-workflow-test.prompt.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.github/prompts/drift-ai-integration.prompt.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.github/prompts/drift-ci-gate.prompt.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.github/prompts/drift-onboarding.prompt.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.github/prompts/drift-signal-quality.prompt.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.github/prompts/field-tests/README.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.github/prompts/field-tests/drift-context-eval.prompt.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.github/prompts/field-tests/drift-field-test.prompt.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.github/prompts/field-tests/drift-finding-audit.prompt.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.github/prompts/release.prompt.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.github/release-drafter.yml +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.github/repo-guard.blocklist +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.github/repo-root-allowlist +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.github/skills/drift-adr-workflow/SKILL.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.github/skills/drift-agent-prompt-authoring/SKILL.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.github/skills/drift-commit-push/SKILL.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.github/skills/drift-ground-truth-fixture-development/SKILL.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.github/skills/drift-release/SKILL.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.github/skills/drift-risk-audit-artifact-updates/SKILL.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.github/skills/drift-security-triage/SKILL.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.github/skills/drift-signal-development-full-lifecycle/SKILL.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.github/skills/gif-creation/SKILL.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.github/skills/gif-creation/references/windows-gif-workflow.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.github/skills/posthog-analytics/SKILL.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.github/skills/posthog-analytics/references/posthog-implementation.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.github/skills/svg-distribution-design/SKILL.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.github/skills/svg-distribution-design/references/distribution-svg-guidelines.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.github/workflows/README.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.github/workflows/ci.yml +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.github/workflows/codeql.yml +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.github/workflows/dependency-review.yml +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.github/workflows/doc-consistency.yml +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.github/workflows/docker.yml +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.github/workflows/docs.yml +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.github/workflows/fp-oracle-audit.yml +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.github/workflows/install-smoke.yml +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.github/workflows/labeler.yml +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.github/workflows/labels-sync.yml +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.github/workflows/package-kpis.yml +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.github/workflows/perf-regression-loop.yml +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.github/workflows/publish.yml +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.github/workflows/release.yml +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.github/workflows/repo-guard.yml +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.github/workflows/security-hygiene.yml +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.github/workflows/stale.yml +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.github/workflows/validate-release.yml +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.github/workflows/welcome.yml +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.github/workflows/workflow-sanity.yml +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.gitignore +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.markdownlint-cli2.jsonc +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.pre-commit-config.yaml +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.pre-commit-hooks.yaml +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.shellcheckrc +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.vscode/mcp.json +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.vscode/settings.json +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/.vscode/tasks.json +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/CODE_OF_CONDUCT.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/CONTRIBUTING.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/Dockerfile +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/Formula/drift-analyzer.rb +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/LICENSE +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/Makefile +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/POLICY.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/README.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/ROADMAP.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/SUPPORT.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/action.yml +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/benchmarks/corpus/.drift-cache-golden/parse/01611cd8233f2aa70c571f9e8c4ebdc2.json +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/benchmarks/corpus/.drift-cache-golden/parse/1e7cd9a98b3290c41e5e10dec26e35ea.json +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/benchmarks/corpus/.drift-cache-golden/parse/1f2d1a22e9791d9b2f3078612aa0f786.json +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/benchmarks/corpus/.drift-cache-golden/parse/226ac9d816e43df5ddc2a1f105ddc628.json +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/benchmarks/corpus/.drift-cache-golden/parse/2a5d4c9a80c6ea7a6d71ccf7c05c4ad2.json +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/benchmarks/corpus/.drift-cache-golden/parse/2baf118e8a0d13742b95d19cfcfa2e02.json +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/benchmarks/corpus/.drift-cache-golden/parse/3ea99d008b13c9720d79eb1aa60ee1ee.json +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/benchmarks/corpus/.drift-cache-golden/parse/4a8a215b34caf38fa4855682a7e35be5.json +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/benchmarks/corpus/.drift-cache-golden/parse/59d0360c97970456beb61a677362a68a.json +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/benchmarks/corpus/.drift-cache-golden/parse/5e610090f38b99b552831f348dfbdfff.json +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/benchmarks/corpus/.drift-cache-golden/parse/6186fe9a4dbfaeaef44654495863e533.json +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/benchmarks/corpus/.drift-cache-golden/parse/78756d46421bd849ad69b53db46cd81b.json +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/benchmarks/corpus/.drift-cache-golden/parse/cb6867a7470df13c2227fef55eb91904.json +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/benchmarks/corpus/.drift-cache-golden/parse/ce1b0ac9777a398ce99594f664bcd978.json +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/benchmarks/corpus/.drift-cache-golden/parse/d784163017a2693256dad9b1540716ae.json +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/benchmarks/corpus/.drift-cache-golden/parse/e174dbe14bbe023518432fa603b5f4b1.json +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/benchmarks/corpus/.drift-cache-golden/parse/e6c7265a3e1a5c08fcae73860b077763.json +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/benchmarks/corpus/.drift-cache-golden/parse/e914253ffba0b698dc7b3ca2da261100.json +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/benchmarks/corpus/.drift-cache-golden/parse/ec975ed99470aaa822b6caf0fa31ffc6.json +0 -0
- /drift_analyzer-2.7.0/benchmarks/corpus/.drift-cache-golden/signals/architecture_violation_4b0be3363be6ee8a_e2453b10bd54639f593783c294ce3751.json → /drift_analyzer-2.7.2/benchmarks/corpus/.drift-cache-golden/signals/architecture_violation_0e43163985631ecc_e2453b10bd54639f593783c294ce3751.json +0 -0
- /drift_analyzer-2.7.0/benchmarks/corpus/.drift-cache-golden/signals/broad_exception_monoculture_4b0be3363be6ee8a_e2453b10bd54639f593783c294ce3751.json → /drift_analyzer-2.7.2/benchmarks/corpus/.drift-cache-golden/signals/broad_exception_monoculture_0e43163985631ecc_e2453b10bd54639f593783c294ce3751.json +0 -0
- /drift_analyzer-2.7.0/benchmarks/corpus/.drift-cache-golden/signals/bypass_accumulation_4b0be3363be6ee8a_e2453b10bd54639f593783c294ce3751.json → /drift_analyzer-2.7.2/benchmarks/corpus/.drift-cache-golden/signals/bypass_accumulation_0e43163985631ecc_e2453b10bd54639f593783c294ce3751.json +0 -0
- /drift_analyzer-2.7.0/benchmarks/corpus/.drift-cache-golden/signals/circular_import_4b0be3363be6ee8a_e2453b10bd54639f593783c294ce3751.json → /drift_analyzer-2.7.2/benchmarks/corpus/.drift-cache-golden/signals/circular_import_0e43163985631ecc_e2453b10bd54639f593783c294ce3751.json +0 -0
- /drift_analyzer-2.7.0/benchmarks/corpus/.drift-cache-golden/signals/co_change_coupling_4b0be3363be6ee8a_e2453b10bd54639f593783c294ce3751.json → /drift_analyzer-2.7.2/benchmarks/corpus/.drift-cache-golden/signals/co_change_coupling_0e43163985631ecc_e2453b10bd54639f593783c294ce3751.json +0 -0
- /drift_analyzer-2.7.0/benchmarks/corpus/.drift-cache-golden/signals/cognitive_complexity_4b0be3363be6ee8a_e2453b10bd54639f593783c294ce3751.json → /drift_analyzer-2.7.2/benchmarks/corpus/.drift-cache-golden/signals/cognitive_complexity_0e43163985631ecc_e2453b10bd54639f593783c294ce3751.json +0 -0
- /drift_analyzer-2.7.0/benchmarks/corpus/.drift-cache-golden/signals/cohesion_deficit_4b0be3363be6ee8a_e2453b10bd54639f593783c294ce3751.json → /drift_analyzer-2.7.2/benchmarks/corpus/.drift-cache-golden/signals/cohesion_deficit_0e43163985631ecc_e2453b10bd54639f593783c294ce3751.json +0 -0
- /drift_analyzer-2.7.0/benchmarks/corpus/.drift-cache-golden/signals/dead_code_accumulation_4b0be3363be6ee8a_e2453b10bd54639f593783c294ce3751.json → /drift_analyzer-2.7.2/benchmarks/corpus/.drift-cache-golden/signals/dead_code_accumulation_0e43163985631ecc_e2453b10bd54639f593783c294ce3751.json +0 -0
- /drift_analyzer-2.7.0/benchmarks/corpus/.drift-cache-golden/signals/doc_impl_drift_4b0be3363be6ee8a_e2453b10bd54639f593783c294ce3751.json → /drift_analyzer-2.7.2/benchmarks/corpus/.drift-cache-golden/signals/doc_impl_drift_0e43163985631ecc_e2453b10bd54639f593783c294ce3751.json +0 -0
- /drift_analyzer-2.7.0/benchmarks/corpus/.drift-cache-golden/signals/exception_contract_drift_4b0be3363be6ee8a_e2453b10bd54639f593783c294ce3751.json → /drift_analyzer-2.7.2/benchmarks/corpus/.drift-cache-golden/signals/exception_contract_drift_0e43163985631ecc_e2453b10bd54639f593783c294ce3751.json +0 -0
- /drift_analyzer-2.7.0/benchmarks/corpus/.drift-cache-golden/signals/explainability_deficit_4b0be3363be6ee8a_e2453b10bd54639f593783c294ce3751.json → /drift_analyzer-2.7.2/benchmarks/corpus/.drift-cache-golden/signals/explainability_deficit_0e43163985631ecc_e2453b10bd54639f593783c294ce3751.json +0 -0
- /drift_analyzer-2.7.0/benchmarks/corpus/.drift-cache-golden/signals/fan_out_explosion_4b0be3363be6ee8a_e2453b10bd54639f593783c294ce3751.json → /drift_analyzer-2.7.2/benchmarks/corpus/.drift-cache-golden/signals/fan_out_explosion_0e43163985631ecc_e2453b10bd54639f593783c294ce3751.json +0 -0
- /drift_analyzer-2.7.0/benchmarks/corpus/.drift-cache-golden/signals/guard_clause_deficit_4b0be3363be6ee8a_e2453b10bd54639f593783c294ce3751.json → /drift_analyzer-2.7.2/benchmarks/corpus/.drift-cache-golden/signals/guard_clause_deficit_0e43163985631ecc_e2453b10bd54639f593783c294ce3751.json +0 -0
- /drift_analyzer-2.7.0/benchmarks/corpus/.drift-cache-golden/signals/hardcoded_secret_4b0be3363be6ee8a_e2453b10bd54639f593783c294ce3751.json → /drift_analyzer-2.7.2/benchmarks/corpus/.drift-cache-golden/signals/hardcoded_secret_0e43163985631ecc_e2453b10bd54639f593783c294ce3751.json +0 -0
- /drift_analyzer-2.7.0/benchmarks/corpus/.drift-cache-golden/signals/insecure_default_4b0be3363be6ee8a_e2453b10bd54639f593783c294ce3751.json → /drift_analyzer-2.7.2/benchmarks/corpus/.drift-cache-golden/signals/insecure_default_0e43163985631ecc_e2453b10bd54639f593783c294ce3751.json +0 -0
- /drift_analyzer-2.7.0/benchmarks/corpus/.drift-cache-golden/signals/missing_authorization_4b0be3363be6ee8a_e2453b10bd54639f593783c294ce3751.json → /drift_analyzer-2.7.2/benchmarks/corpus/.drift-cache-golden/signals/missing_authorization_0e43163985631ecc_e2453b10bd54639f593783c294ce3751.json +0 -0
- /drift_analyzer-2.7.0/benchmarks/corpus/.drift-cache-golden/signals/mutant_duplicate_4b0be3363be6ee8a_e2453b10bd54639f593783c294ce3751.json → /drift_analyzer-2.7.2/benchmarks/corpus/.drift-cache-golden/signals/mutant_duplicate_0e43163985631ecc_e2453b10bd54639f593783c294ce3751.json +0 -0
- /drift_analyzer-2.7.0/benchmarks/corpus/.drift-cache-golden/signals/naming_contract_violation_4b0be3363be6ee8a_e2453b10bd54639f593783c294ce3751.json → /drift_analyzer-2.7.2/benchmarks/corpus/.drift-cache-golden/signals/naming_contract_violation_0e43163985631ecc_e2453b10bd54639f593783c294ce3751.json +0 -0
- /drift_analyzer-2.7.0/benchmarks/corpus/.drift-cache-golden/signals/pattern_fragmentation_4b0be3363be6ee8a_e2453b10bd54639f593783c294ce3751.json → /drift_analyzer-2.7.2/benchmarks/corpus/.drift-cache-golden/signals/pattern_fragmentation_0e43163985631ecc_e2453b10bd54639f593783c294ce3751.json +0 -0
- /drift_analyzer-2.7.0/benchmarks/corpus/.drift-cache-golden/signals/system_misalignment_4b0be3363be6ee8a_e2453b10bd54639f593783c294ce3751.json → /drift_analyzer-2.7.2/benchmarks/corpus/.drift-cache-golden/signals/phantom_reference_0e43163985631ecc_e2453b10bd54639f593783c294ce3751.json +0 -0
- /drift_analyzer-2.7.0/benchmarks/corpus/.drift-cache-golden/signals/temporal_volatility_4b0be3363be6ee8a_e2453b10bd54639f593783c294ce3751.json → /drift_analyzer-2.7.2/benchmarks/corpus/.drift-cache-golden/signals/system_misalignment_0e43163985631ecc_e2453b10bd54639f593783c294ce3751.json +0 -0
- /drift_analyzer-2.7.0/benchmarks/corpus/.drift-cache-golden/signals/ts_architecture_4b0be3363be6ee8a_e2453b10bd54639f593783c294ce3751.json → /drift_analyzer-2.7.2/benchmarks/corpus/.drift-cache-golden/signals/temporal_volatility_0e43163985631ecc_e2453b10bd54639f593783c294ce3751.json +0 -0
- /drift_analyzer-2.7.0/benchmarks/corpus/.drift-cache-golden/signals/test_polarity_deficit_4b0be3363be6ee8a_e2453b10bd54639f593783c294ce3751.json → /drift_analyzer-2.7.2/benchmarks/corpus/.drift-cache-golden/signals/test_polarity_deficit_0e43163985631ecc_e2453b10bd54639f593783c294ce3751.json +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/benchmarks/corpus/README.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/benchmarks/corpus/manifest.json +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/benchmarks/corpus/src/myapp/__init__.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/benchmarks/corpus/src/myapp/connectors/__init__.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/benchmarks/corpus/src/myapp/connectors/db.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/benchmarks/corpus/src/myapp/handler_v1.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/benchmarks/corpus/src/myapp/handler_v2.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/benchmarks/corpus/src/myapp/handlers/__init__.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/benchmarks/corpus/src/myapp/handlers/auth.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/benchmarks/corpus/src/myapp/handlers/orders.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/benchmarks/corpus/src/myapp/handlers/payments.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/benchmarks/corpus/src/myapp/handlers/shipping.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/benchmarks/corpus/src/myapp/models/__init__.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/benchmarks/corpus/src/myapp/models/core.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/benchmarks/corpus/src/myapp/models/enriched.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/benchmarks/corpus/src/myapp/outlier_module.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/benchmarks/corpus/src/myapp/processors/__init__.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/benchmarks/corpus/src/myapp/processors/pricing.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/benchmarks/corpus/src/myapp/processors/transform.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/benchmarks/corpus/src/myapp/processors/validator.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/benchmarks/corpus/src/myapp/service_a.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/benchmarks/corpus/src/myapp/service_b.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/benchmarks/corpus/src/myapp/utils/__init__.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/benchmarks/corpus/src/myapp/utils/formatting.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/benchmarks/corpus/src/myapp/utils/helpers.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/benchmarks/corpus/src/myapp/utils/naming.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/benchmarks/corpus/tests/__init__.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/benchmarks/corpus/tests/test_api.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/benchmarks/oracle_repos.json +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/conda.recipe/meta.yaml +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/decisions/ADR-010-finding-context-triage-policy.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/decisions/ADR-011-csv-output-format.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/decisions/ADR-012-copilot-context-actionability-pfs-nbv.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/decisions/ADR-013-scan-signal-filtering-and-per-signal-cap.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/decisions/ADR-014-mds-precision-first-scoring-readiness.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/decisions/ADR-016-security-signals-wave2-calibration.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/decisions/ADR-017-dia-false-positive-reduction.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/decisions/ADR-018-avs-co-change-precision-hardening.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/decisions/ADR-019-pfs-return-pattern-extraction.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/decisions/ADR-020-agent-fix-loop-optimization.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/decisions/ADR-021-batch-dominant-fix-loop-orchestration.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/decisions/ADR-022-mcp-session-management.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/decisions/ADR-023-canonical-examples-in-agent-output.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/decisions/ADR-024-next-step-contracts.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/decisions/ADR-025-orchestration-layer-workflow-plans-handoffs.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/decisions/ADR-025-task-queue-leasing.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/decisions/ADR-026-a2a-agent-card-http-serve.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/decisions/ADR-027-finding-status-for-suppression-transparency.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/decisions/ADR-028-analyzer-warning-channel.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/decisions/templates/README.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/decisions/templates/adr-template.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/decisions/templates/signal-design-template.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/docs/EPISTEMICS.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/docs/MAINTAINER_RUNBOOK.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/docs/OUTREACH.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/docs/PRODUCT_STRATEGY.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/docs/REPOSITORY_GOVERNANCE.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/docs/ROOT_POLICY.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/docs/adr/001-deterministic-analysis-pipeline.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/docs/adr/002-ast-fingerprinting-for-patterns.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/docs/adr/003-composite-scoring-model.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/docs/adr/004-subprocess-git-parsing.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/docs/adr/005-delta-first-score-interpretation.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/docs/adr/006-context-tagging.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/docs/adr/007-consistency-proxy-signals.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/docs/adr/008-intention-contract-proxy-signals.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/docs/distribution/README.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/docs/distribution/awesome-submissions.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/docs/distribution/channel-rules.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/docs/distribution/devto-hashnode-5-repos.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/docs/distribution/ide-discovery-mvp-spec.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/docs/distribution/website-post-checklist.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/docs/distribution/week1-rollout-runbook.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/docs/drift-architecture-erosion-analysis.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/docs/language-roadmap.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/docs/language-support-matrix.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/docs/migration.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/docs/python-baseline.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/docs/python-rule-inventory.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/docs-site/algorithms/deep-dive.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/docs-site/algorithms/scoring.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/docs-site/assets/logo.svg +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/docs-site/assets/og-image.svg +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/docs-site/assets/readme-overview.svg +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/docs-site/benchmarking.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/docs-site/case-studies/django.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/docs-site/case-studies/fastapi.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/docs-site/case-studies/index.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/docs-site/case-studies/paramiko.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/docs-site/case-studies/pydantic.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/docs-site/changelog.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/docs-site/comparisons/drift-vs-architecture-conformance.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/docs-site/comparisons/drift-vs-ruff.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/docs-site/comparisons/drift-vs-semgrep-codeql.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/docs-site/comparisons/index.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/docs-site/contributing.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/docs-site/faq.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/docs-site/getting-started/configuration.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/docs-site/getting-started/finding-triage.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/docs-site/getting-started/installation.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/docs-site/getting-started/prompts.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/docs-site/getting-started/quickstart.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/docs-site/getting-started/team-rollout.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/docs-site/getting-started/troubleshooting.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/docs-site/getting-started/vibe-coding-problems.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/docs-site/glossary.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/docs-site/index.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/docs-site/integrations.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/docs-site/javascripts/prove-viewer.js +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/docs-site/product/example-findings.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/docs-site/product/press-brand.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/docs-site/product-strategy.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/docs-site/prove-it.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/docs-site/reference/api-outputs.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/docs-site/reference/negative-context.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/docs-site/reference/performance.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/docs-site/reference/signals/pfs.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/docs-site/stability.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/docs-site/start-here.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/docs-site/study.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/docs-site/stylesheets/drift.css +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/docs-site/trust-evidence.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/docs-site/use-cases/architectural-linter-ai-teams.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/docs-site/use-cases/architecture-drift-python.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/docs-site/use-cases/ci-architecture-checks-sarif.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/docs-site/use-cases/index.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/docs-site/use-cases/technical-debt-ai-codebases.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/examples/demo-project/README.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/examples/demo-project/api/__init__.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/examples/demo-project/api/routes.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/examples/demo-project/db/__init__.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/examples/demo-project/db/models.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/examples/demo-project/services/__init__.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/examples/demo-project/services/email_service.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/examples/demo-project/services/order_service.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/examples/demo-project/services/user_service.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/examples/demo-project/utils/__init__.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/examples/demo-project/utils/validators.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/examples/demo_fastapi.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/examples/drift-check.yml +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/examples/package-kpis/README.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/examples/package-kpis/defects.csv +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/examples/package-kpis/kpi-thresholds.json +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/examples/package-kpis/usage.csv +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/examples/vibe-coding/README.md +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/examples/vibe-coding/claude_desktop_config.json +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/examples/vibe-coding/drift-gate.yml +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/examples/vibe-coding/drift.yaml +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/examples/vibe-coding/mcp.json +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/examples/vibe-coding/pre-push +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/examples/vibe-coding/setup-baseline.sh +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/examples/vibe-coding/weekly-check.sh +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/hooks/docs_version.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/mkdocs.yml +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/overrides/404.html +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/overrides/home.html +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/overrides/main.html +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/__init__.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/__main__.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/analyzer.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/analyzers/typescript/__init__.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/analyzers/typescript/_path_utils.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/analyzers/typescript/alias_resolver.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/analyzers/typescript/barrel_resolver.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/analyzers/typescript/import_graph.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/analyzers/typescript/shared.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/analyzers/typescript/workspace_boundaries.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/api_helpers.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/baseline.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/cache.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/cli.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/commands/__init__.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/commands/_io.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/commands/analyze.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/commands/badge.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/commands/baseline.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/commands/brief.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/commands/check.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/commands/config_cmd.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/commands/copilot_context.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/commands/diff_cmd.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/commands/explain.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/commands/export_context.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/commands/fix_plan.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/commands/init_cmd.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/commands/mcp.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/commands/patterns.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/commands/precision_cmd.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/commands/scan.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/commands/self_analyze.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/commands/serve.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/commands/start.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/commands/timeline.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/commands/trend.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/commands/validate_cmd.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/context_tags.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/copilot_context.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/embeddings.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/errors.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/finding_context.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/guardrails.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/incremental.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/ingestion/__init__.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/ingestion/ast_parser.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/ingestion/file_discovery.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/ingestion/git_history.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/ingestion/ts_parser.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/negative_context.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/negative_context_export.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/output/__init__.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/output/csv_output.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/output/github_format.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/output/json_output.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/output/rich_output.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/plugins.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/profiles.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/py.typed +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/recommendations.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/rules/tsjs/circular_module_detection.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/rules/tsjs/cross_package_import_ban.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/rules/tsjs/layer_leak_detection.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/rules/tsjs/ui_to_infra_import_ban.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/scope_resolver.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/scoring/__init__.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/scoring/engine.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/serve/__init__.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/serve/a2a_router.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/serve/agent_card.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/serve/app.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/serve/models.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/signals/_utils.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/signals/architecture_violation.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/signals/base.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/signals/broad_exception_monoculture.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/signals/bypass_accumulation.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/signals/circular_import.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/signals/co_change_coupling.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/signals/cognitive_complexity.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/signals/cohesion_deficit.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/signals/dead_code_accumulation.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/signals/doc_impl_drift.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/signals/exception_contract_drift.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/signals/explainability_deficit.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/signals/fan_out_explosion.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/signals/guard_clause_deficit.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/signals/hardcoded_secret.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/signals/insecure_default.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/signals/missing_authorization.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/signals/mutant_duplicates.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/signals/naming_contract_violation.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/signals/pattern_fragmentation.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/signals/system_misalignment.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/signals/temporal_volatility.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/signals/test_polarity_deficit.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/signals/ts_architecture.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/suppression.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/telemetry.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/timeline.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/trend_history.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/src/drift/types.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/__init__.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/conftest.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/fixtures/__init__.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/fixtures/study_samples/debt_correlation.json +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/fixtures/study_samples/rater_matrix.json +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/fixtures/study_samples/self_analysis_reports.json +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/fixtures/tsjs_alias_resolution/src/app.ts +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/fixtures/tsjs_alias_resolution/src/core/logger.ts +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/fixtures/tsjs_alias_resolution/src/shared/config.ts +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/fixtures/tsjs_alias_resolution/tsconfig.json +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/fixtures/tsjs_alias_resolution_extends/src/app.ts +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/fixtures/tsjs_alias_resolution_extends/src/base/logger.ts +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/fixtures/tsjs_alias_resolution_extends/src/leaf/feature.ts +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/fixtures/tsjs_alias_resolution_extends/src/mid/util.ts +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/fixtures/tsjs_alias_resolution_extends/src/override/config.ts +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/fixtures/tsjs_alias_resolution_extends/src/shared/config.ts +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/fixtures/tsjs_alias_resolution_extends/tsconfig.base.json +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/fixtures/tsjs_alias_resolution_extends/tsconfig.json +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/fixtures/tsjs_alias_resolution_extends/tsconfig.mid.json +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/fixtures/tsjs_barrel_resolution/src/app.ts +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/fixtures/tsjs_barrel_resolution/src/app_tsx.ts +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/fixtures/tsjs_barrel_resolution/src/button.tsx +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/fixtures/tsjs_barrel_resolution/src/index.ts +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/fixtures/tsjs_barrel_resolution/src/view/card.tsx +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/fixtures/tsjs_barrel_resolution/src/view/index.tsx +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/fixtures/tsjs_graph_relative/app.ts +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/fixtures/tsjs_graph_relative/components/button.tsx +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/fixtures/tsjs_graph_relative/components/index.ts +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/fixtures/tsjs_graph_relative/lib/util.ts +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/fixtures/tsjs_rule_cross_package/negative/cross_package_import_ban.json +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/fixtures/tsjs_rule_cross_package/negative/package.json +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/fixtures/tsjs_rule_cross_package/negative/packages/app/src/main.ts +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/fixtures/tsjs_rule_cross_package/negative/packages/ui/src/button.ts +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/fixtures/tsjs_rule_cross_package/positive/cross_package_import_ban.json +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/fixtures/tsjs_rule_cross_package/positive/package.json +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/fixtures/tsjs_rule_cross_package/positive/packages/app/src/main.ts +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/fixtures/tsjs_rule_cross_package/positive/packages/ui/src/button.ts +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/fixtures/tsjs_rule_cycles/negative/src/a.ts +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/fixtures/tsjs_rule_cycles/negative/src/b.ts +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/fixtures/tsjs_rule_cycles/positive/src/a.ts +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/fixtures/tsjs_rule_cycles/positive/src/b.ts +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/fixtures/tsjs_rule_layer_leak/negative/layer_leak_detection.json +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/fixtures/tsjs_rule_layer_leak/negative/src/infra/storage.ts +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/fixtures/tsjs_rule_layer_leak/negative/src/ui/view.ts +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/fixtures/tsjs_rule_layer_leak/positive/layer_leak_detection.json +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/fixtures/tsjs_rule_layer_leak/positive/src/infra/storage.ts +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/fixtures/tsjs_rule_layer_leak/positive/src/ui/view.ts +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/fixtures/tsjs_rule_ui_to_infra/negative/src/infra/storage.ts +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/fixtures/tsjs_rule_ui_to_infra/negative/src/ui/components/button.ts +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/fixtures/tsjs_rule_ui_to_infra/negative/src/ui/view.ts +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/fixtures/tsjs_rule_ui_to_infra/negative/ui_to_infra_import_ban.json +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/fixtures/tsjs_rule_ui_to_infra/positive/src/infra/storage.ts +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/fixtures/tsjs_rule_ui_to_infra/positive/src/ui/view.ts +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/fixtures/tsjs_rule_ui_to_infra/positive/ui_to_infra_import_ban.json +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/fixtures/tsjs_workspace_boundaries/package.json +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/fixtures/tsjs_workspace_boundaries/packages/app/src/main.ts +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/fixtures/tsjs_workspace_boundaries/packages/ui/src/button.tsx +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/fixtures/tsjs_workspace_boundaries/vite.config.ts +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/golden/corpus_snapshot.sarif +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_a2a_serve.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_ablation.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_agent_native_cli.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_agent_tasks.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_ai_tool_indicators.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_analysis_degradation.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_analysis_edge_cases.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_architecture_violation.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_ast_parser.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_avs_enhanced.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_avs_missing_patterns_evidence.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_avs_mutations.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_badge_command.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_baseline.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_batch_metadata.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_benchmark_label_keys.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_benchmark_structure.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_brief.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_bypass_accumulation.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_cache_resilience.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_ci_reality.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_circular_import.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_cli_runtime.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_co_change_coupling.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_cognitive_complexity.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_cohesion_deficit.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_compat.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_config.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_config_schema.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_config_validate.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_consistency_proxies.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_console_scripts.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_context_tags.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_copilot_context_actionability.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_copilot_context_coverage.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_csv_output.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_dead_code_accumulation.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_delta_first.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_dia_enhanced.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_dx_features.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_eds_api_corresponding_tests.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_embeddings.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_enterprise_governance_assets.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_exception_contract_drift.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_fan_out_explosion.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_fetch_github_usage.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_fetch_pypistats.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_file_discovery.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_finding_context.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_fix_actionability.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_git_history_edge_cases.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_git_history_safety.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_golden_snapshot.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_guard_clause_deficit.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_hardcoded_secret.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_incremental.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_init_cmd.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_insecure_default.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_integration.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_issue_138_139_140.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_json_output.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_malformed_history.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_mcp_copilot.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_mirofish_signal_improvements.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_missing_authorization.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_model_consistency.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_module_entrypoint.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_mutant_duplicates_edge_cases.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_naming_contract_violation.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_negative_context.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_negative_context_export.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_nudge.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_orchestration_extensions.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_output_golden.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_output_minimal_and_signal_labels.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_package_kpis.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_parse_file_resilience.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_path_overrides.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_pattern_fragmentation.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_patterns_command.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_pipeline_components.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_precision_recall.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_property_based.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_recommendations.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_recommendations_edge_cases.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_release_automation.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_release_discipline.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_repo_hygiene.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_rule_ids.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_sarif_contract.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_scope_resolver.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_scoring.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_scoring_edge_cases.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_self_command.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_session.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_signal_contract.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_signal_crash_guard.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_signal_utils.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_smoke_real_repos.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_study_infrastructure.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_suppression.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_task_graph.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_task_queue.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_test_polarity_deficit.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_timeline.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_timeline_command.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_trend_chart.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_trend_command_history.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_ts_signals_phase2.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_ts_signals_phase3.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_tsjs_alias_resolution.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_tsjs_barrel_resolution.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_tsjs_import_graph_relative.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_tsjs_rule_circular_module_detection.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_tsjs_rule_cross_package_import_ban.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_tsjs_rule_layer_leak_detection.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_tsjs_rule_ui_to_infra_import_ban.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_tsjs_workspace_boundaries.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_typescript_parser.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/tests/test_workspace_value.py +0 -0
- {drift_analyzer-2.7.0 → drift_analyzer-2.7.2}/uv.lock +0 -0
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
name: Real-Repo Evaluation
|
|
2
|
+
description: Share your experience running drift on a real-world repository
|
|
3
|
+
title: "[Eval] "
|
|
4
|
+
labels: ["real-repo-evaluation"]
|
|
5
|
+
body:
|
|
6
|
+
- type: markdown
|
|
7
|
+
attributes:
|
|
8
|
+
value: |
|
|
9
|
+
Thanks for trying drift on a real repository! Your feedback helps us improve signal quality and first-run experience.
|
|
10
|
+
|
|
11
|
+
**Tip:** Run `drift analyze --report report.md` to generate a shareable Markdown report, then paste it below or attach the file.
|
|
12
|
+
|
|
13
|
+
- type: input
|
|
14
|
+
id: repo
|
|
15
|
+
attributes:
|
|
16
|
+
label: Repository
|
|
17
|
+
description: Link to the repository or its name (public or description of private repo)
|
|
18
|
+
placeholder: "e.g. https://github.com/org/repo or 'internal Django monolith, ~50k LOC'"
|
|
19
|
+
validations:
|
|
20
|
+
required: true
|
|
21
|
+
|
|
22
|
+
- type: input
|
|
23
|
+
id: drift_version
|
|
24
|
+
attributes:
|
|
25
|
+
label: Drift version
|
|
26
|
+
description: "Output of `drift --version`"
|
|
27
|
+
placeholder: "e.g. 2.5.1"
|
|
28
|
+
validations:
|
|
29
|
+
required: true
|
|
30
|
+
|
|
31
|
+
- type: dropdown
|
|
32
|
+
id: overall_impression
|
|
33
|
+
attributes:
|
|
34
|
+
label: Overall impression
|
|
35
|
+
description: How useful were drift's findings?
|
|
36
|
+
options:
|
|
37
|
+
- "Very useful — found real issues I should address"
|
|
38
|
+
- "Somewhat useful — some good findings mixed with noise"
|
|
39
|
+
- "Neutral — nothing surprising, nothing wrong"
|
|
40
|
+
- "Not useful — mostly false positives or irrelevant"
|
|
41
|
+
- "Confusing — output was hard to interpret"
|
|
42
|
+
validations:
|
|
43
|
+
required: true
|
|
44
|
+
|
|
45
|
+
- type: textarea
|
|
46
|
+
id: setup_experience
|
|
47
|
+
attributes:
|
|
48
|
+
label: Setup experience
|
|
49
|
+
description: "How was the installation and first run? Any friction?"
|
|
50
|
+
placeholder: |
|
|
51
|
+
e.g. "pip install worked cleanly, but first run timed out on our monorepo"
|
|
52
|
+
or "Had trouble with shallow clones in CI"
|
|
53
|
+
validations:
|
|
54
|
+
required: false
|
|
55
|
+
|
|
56
|
+
- type: textarea
|
|
57
|
+
id: useful_findings
|
|
58
|
+
attributes:
|
|
59
|
+
label: Most useful findings
|
|
60
|
+
description: "Which findings resonated? Were there any 'aha' moments?"
|
|
61
|
+
placeholder: |
|
|
62
|
+
e.g. "PFS correctly identified our duplicated validation logic across 3 modules"
|
|
63
|
+
validations:
|
|
64
|
+
required: false
|
|
65
|
+
|
|
66
|
+
- type: textarea
|
|
67
|
+
id: false_positives
|
|
68
|
+
attributes:
|
|
69
|
+
label: False positives or noise
|
|
70
|
+
description: "Any findings that were clearly wrong or unhelpful? Include signal ID + file if possible."
|
|
71
|
+
placeholder: |
|
|
72
|
+
e.g. "DIA flagged our generated API docs — these are auto-generated and intentionally diverge"
|
|
73
|
+
validations:
|
|
74
|
+
required: false
|
|
75
|
+
|
|
76
|
+
- type: textarea
|
|
77
|
+
id: missing_findings
|
|
78
|
+
attributes:
|
|
79
|
+
label: Things drift missed
|
|
80
|
+
description: "Any known issues in your codebase that drift did not detect?"
|
|
81
|
+
placeholder: |
|
|
82
|
+
e.g. "We have significant layering violations between api/ and core/ that weren't flagged"
|
|
83
|
+
validations:
|
|
84
|
+
required: false
|
|
85
|
+
|
|
86
|
+
- type: textarea
|
|
87
|
+
id: report
|
|
88
|
+
attributes:
|
|
89
|
+
label: Drift report (optional)
|
|
90
|
+
description: |
|
|
91
|
+
Paste the output of `drift analyze --report report.md` or attach the file.
|
|
92
|
+
Wrap in a details tag if it's long.
|
|
93
|
+
render: markdown
|
|
94
|
+
validations:
|
|
95
|
+
required: false
|
|
96
|
+
|
|
97
|
+
- type: textarea
|
|
98
|
+
id: suggestions
|
|
99
|
+
attributes:
|
|
100
|
+
label: Suggestions
|
|
101
|
+
description: "What would make drift more useful for your workflow?"
|
|
102
|
+
validations:
|
|
103
|
+
required: false
|
|
@@ -199,14 +199,16 @@ Wenn ein Agent Drift-Findings über MCP-Tools beheben soll, **muss** dieser Abla
|
|
|
199
199
|
|
|
200
200
|
1. **`drift_session_start(path=".", autopilot=true)`** — ein Aufruf statt vier (bündelt validate + brief + scan + fix_plan)
|
|
201
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.
|
|
203
|
-
4. **`
|
|
202
|
+
3. **Test-Checkpoint nach `nudge`** — gezielte Tests per Pfad-Matrix ausführen (Tabelle in `.github/prompts/drift-fix-loop.prompt.md`, Schritt 3b); bei Fehlschlag Entscheidungsbaum anwenden: Test anpassen (Implementation-Details) oder Fix reverten (Vertrags-Regression) — kein Hard-Block
|
|
203
|
+
4. **`drift_fix_plan(session_id=..., max_tasks=1)`** — nächsten Task holen (immer `max_tasks=1`)
|
|
204
|
+
5. **`drift_diff(session_id=..., uncommitted=true)`** — nur einmal am Ende als Abschluss-Verifikation
|
|
204
205
|
|
|
205
206
|
**Verboten im Fix-Loop:**
|
|
206
207
|
- `drift_scan` nach jeder Dateiänderung (zu teuer, nutze `nudge`)
|
|
207
208
|
- `session_start` ohne `autopilot=true` (verschenkt 4 Roundtrips)
|
|
208
209
|
- `fix_plan` ohne `max_tasks=1` (unnötig große Responses)
|
|
209
210
|
- Tool-Aufrufe ohne `session_id` (verliert Kontext)
|
|
211
|
+
- Commit ohne Test-Checkpoint (Tests fallen sonst erst bei Gate 8 CI auf)
|
|
210
212
|
|
|
211
213
|
**Immer:** `agent_instruction` und `next_tool_call` aus Responses befolgen.
|
|
212
214
|
|
|
@@ -232,8 +234,8 @@ Vollständiger Developer Guide: **[DEVELOPER.md](../DEVELOPER.md)**
|
|
|
232
234
|
|
|
233
235
|
```
|
|
234
236
|
ingestion/ → signals/ → scoring/ → output/
|
|
235
|
-
AST + Git
|
|
236
|
-
(15 scoring-aktiv,
|
|
237
|
+
AST + Git 24 Detektoren Score+Severity Rich/JSON/SARIF
|
|
238
|
+
(15 scoring-aktiv, 9 report-only)
|
|
237
239
|
```
|
|
238
240
|
|
|
239
241
|
### Wichtigste Kommandos
|
|
@@ -288,7 +290,7 @@ DRIFT_SKIP_HOOKS=1 git push # ALLE Gates (äußerster Notfall)
|
|
|
288
290
|
|
|
289
291
|
| Pfad | Inhalt |
|
|
290
292
|
|------|--------|
|
|
291
|
-
| `src/drift/signals/` |
|
|
293
|
+
| `src/drift/signals/` | 24 Signale — 15 scoring-aktiv (PFS, AVS, MDS, EDS, TVS, SMS, DIA, BEM, TPD, GCD, NBV, BAT, ECM, COD, CCC) + 9 report-only (TSA, CXS, FOE, CIR, DCA, MAZ, ISD, HSC, PHR) |
|
|
292
294
|
| `src/drift/ingestion/` | AST-Parsing, Git-History, File-Discovery |
|
|
293
295
|
| `src/drift/scoring/` | Composite-Score, Module-Scores, Severity |
|
|
294
296
|
| `src/drift/output/` | Rich-Terminal, JSON, SARIF |
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
---
|
|
2
|
+
applyTo: "**"
|
|
3
|
+
description: "Kontext-Routing — Zuordnung von Aufgabentypen zu relevanten Instructions und Skills. Hilft Agenten, bei großem Instruction-Volumen die richtigen Regeln zu priorisieren."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Kontext-Routing — Welche Regeln gelten wann?
|
|
7
|
+
|
|
8
|
+
> **Zweck:** Nicht alle Instructions und Skills sind für jede Aufgabe gleich relevant.
|
|
9
|
+
> Diese Datei hilft dem Agenten, den Fokus auf die wichtigsten Regeln zu legen.
|
|
10
|
+
|
|
11
|
+
## Routing-Tabelle
|
|
12
|
+
|
|
13
|
+
| Aufgabentyp | Primäre Instructions | Relevante Skills | Primärer Fokus |
|
|
14
|
+
|-------------|---------------------|-----------------|----------------|
|
|
15
|
+
| **Signal-Arbeit** (neues Signal, Heuristik-Änderung) | drift-policy, drift-push-gates (Gate 2+7) | drift-signal-development-full-lifecycle, drift-risk-audit-artifact-updates, drift-adr-workflow | ADR-Pflicht, Audit-Pflicht, Precision/Recall |
|
|
16
|
+
| **Scoring/Gewichte** | drift-policy (§6 Priorisierung) | drift-adr-workflow | ADR-Pflicht, Benchmark-Evidence |
|
|
17
|
+
| **Output-Format** | drift-policy, drift-push-gates (Gate 7) | drift-adr-workflow, drift-risk-audit-artifact-updates | ADR-Pflicht, STRIDE-Update |
|
|
18
|
+
| **Bugfix** (`fix:`) | drift-policy, drift-push-gates (Gate 3+8) | drift-commit-push | CHANGELOG, Tests, kein ADR nötig |
|
|
19
|
+
| **Feature** (`feat:`) | drift-policy, drift-push-gates (Gate 2+3) | drift-commit-push | Feature-Evidence, Tests, CHANGELOG, STUDY.md |
|
|
20
|
+
| **Refactoring** | drift-policy, drift-quality-workflow | drift-commit-push | Kein ADR nötig, Tests grün |
|
|
21
|
+
| **Prompt/Instruction** | drift-policy | drift-agent-prompt-authoring | Shared Partials, Modellunabhängigkeit |
|
|
22
|
+
| **PR-Review** | drift-quality-workflow (Stufe 4) | drift-pr-review | Review-Checkliste (`.github/prompts/_partials/review-checkliste.md`) |
|
|
23
|
+
| **Release/Push** | drift-push-gates (alle Gates) | drift-commit-push, drift-release | Alle Gates prüfen, `make check` |
|
|
24
|
+
| **Fixture/Test** | drift-policy | drift-ground-truth-fixture-development | Precision/Recall, Ground Truth |
|
|
25
|
+
| **Dokumentation** | drift-policy (§13 Befund-Qualität) | — | Keine Gate-Pflicht außer Gate 8 |
|
|
26
|
+
|
|
27
|
+
## Priorisierungsregel
|
|
28
|
+
|
|
29
|
+
Wenn mehrere Instructions geladen sind, gilt:
|
|
30
|
+
1. **drift-policy** hat immer Vorrang (PFLICHT-GATE zuerst)
|
|
31
|
+
2. **drift-push-gates** nur relevant bei Commit/Push-Vorbereitung
|
|
32
|
+
3. **drift-quality-workflow** nur relevant bei nicht-trivialen Änderungen
|
|
33
|
+
4. **Release-Instructions** nur relevant bei `src/drift/**`-Änderungen
|
|
34
|
+
|
|
35
|
+
## Kontextreduktion
|
|
36
|
+
|
|
37
|
+
Bei einfachen Aufgaben (Doku-Fix, Typo, triviales Refactoring) reicht:
|
|
38
|
+
- Policy-Gate ausgeben
|
|
39
|
+
- Relevante Gates prüfen (meist nur Gate 8: `make check`)
|
|
40
|
+
- Kein vollständiger Quality-Workflow nötig
|
|
@@ -61,6 +61,8 @@ Keine „quick hacks" ohne Begründungsstruktur.
|
|
|
61
61
|
|
|
62
62
|
Nach jedem pushbaren Zwischenstand wird ein separater BugBot-Review-Schritt ausgeführt.
|
|
63
63
|
|
|
64
|
+
**Strukturierte Review-Checkliste verwenden:** Der Reviewer arbeitet die Checkliste unter `.github/prompts/_partials/review-checkliste.md` Punkt für Punkt ab und dokumentiert pro Punkt Ja / Nein / N/A mit Kurzbegründung. Kein Punkt darf übersprungen werden.
|
|
65
|
+
|
|
64
66
|
**Dieser Review bewertet isoliert und streng:**
|
|
65
67
|
- Korrektheit der Änderung
|
|
66
68
|
- Risiko und Edge Cases
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
---
|
|
2
|
+
applyTo: "src/drift/**"
|
|
3
|
+
description: "Releases are automated via python-semantic-release in CI. Agents must use conventional commits (feat:/fix:/BREAKING:) — no manual release command needed."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Release Automation
|
|
7
|
+
|
|
8
|
+
> **Vollständige Dokumentation:** siehe `drift-release-automation.instructions.md` (gleicher Scope).
|
|
9
|
+
|
|
10
|
+
**Kurzregel:** Conventional Commits (`feat:`, `fix:`, `BREAKING:`) verwenden — CI übernimmt Version, Tag, Release, PyPI.
|
|
11
|
+
Kein manueller Release-Befehl nötig. Fallback: `python scripts/release_automation.py --full-release`.
|
|
12
|
+
python scripts/release_automation.py --full-release
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## See Also
|
|
16
|
+
|
|
17
|
+
- Release Workflow: `.github/workflows/release.yml`
|
|
18
|
+
- PSR Configuration: `pyproject.toml` → `[tool.semantic_release]`
|
|
19
|
+
- Detailed Skill: `.github/skills/drift-release/SKILL.md`
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# Review-Checkliste (Shared Reference)
|
|
2
|
+
|
|
3
|
+
> **Single Source of Truth** — Alle adversarialen Reviews verwenden diese Checkliste.
|
|
4
|
+
> Die Checkliste ersetzt keine Eigenleistung des Reviewers, sie strukturiert sie.
|
|
5
|
+
|
|
6
|
+
## Anwendung
|
|
7
|
+
|
|
8
|
+
Der Reviewer arbeitet die Checkliste Punkt für Punkt ab und dokumentiert pro Punkt:
|
|
9
|
+
- **Ja** / **Nein** / **N/A** (mit Kurzbegründung bei Nein oder N/A)
|
|
10
|
+
|
|
11
|
+
Kein Punkt darf übersprungen werden. Bei Unsicherheit: `Nein` mit Begründung.
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## 1. Policy-Konformität
|
|
16
|
+
|
|
17
|
+
- [ ] **Policy-Gate korrekt?** — Wurde das PFLICHT-GATE sichtbar ausgegeben, und ist die Begründung plausibel (nicht rituell)?
|
|
18
|
+
- [ ] **Zulassungskriterium nachvollziehbar?** — Ist das benannte Kriterium (Unsicherheit / Signal / Glaubwürdigkeit / Handlungsfähigkeit / Trend / Einführbarkeit) tatsächlich adressiert?
|
|
19
|
+
- [ ] **Ausschlusskriterium geprüft?** — Erzeugt die Änderung ausschließlich mehr Ausgabe/Komplexität/Features ohne benennbaren Nutzen?
|
|
20
|
+
- [ ] **Priorisierung eingehalten?** — Verdrängt die Änderung eine höherpriorisierte Aufgabe (§6)?
|
|
21
|
+
|
|
22
|
+
## 2. Scope und Boundaries
|
|
23
|
+
|
|
24
|
+
- [ ] **Scope eingehalten?** — Wurden nur Dateien geändert, die zur Aufgabe gehören?
|
|
25
|
+
- [ ] **Out-of-Scope unberührt?** — Wurden keine Dateien modifiziert, die explizit oder implizit außerhalb des Auftrags liegen?
|
|
26
|
+
- [ ] **Keine ungefragt hinzugefügten Features?** — Enthält die Änderung nur das Angefragte, keine "Verbesserungen" oder Refactorings als Beifang?
|
|
27
|
+
|
|
28
|
+
## 3. Architektur und ADR-Pflicht
|
|
29
|
+
|
|
30
|
+
- [ ] **ADR erforderlich?** — Betrifft die Änderung Signale, Scoring, Output oder Architektur-Boundaries? Falls ja: ADR unter `decisions/` vorhanden (Status `proposed` reicht)?
|
|
31
|
+
- [ ] **Architektur-Layer korrekt?** — Respektiert die Änderung den Datenfluss `ingestion → signals → scoring → output`?
|
|
32
|
+
- [ ] **Keine unzulässigen Layer-Übergriffe?** — Greift kein Modul auf eine Schicht zu, zu der es laut Architektur keinen Zugang haben sollte?
|
|
33
|
+
|
|
34
|
+
## 4. Audit-Pflicht (Policy §18)
|
|
35
|
+
|
|
36
|
+
- [ ] **Betrifft die Änderung `signals/`, `ingestion/` oder `output/`?** — Falls nein: N/A.
|
|
37
|
+
- [ ] **Audit-Artefakte aktualisiert?** — Wurde mindestens das richtige Artefakt inhaltlich (nicht nur kosmetisch) aktualisiert?
|
|
38
|
+
- Signal-Änderung → `fmea_matrix.md` + `fault_trees.md` + `risk_register.md`
|
|
39
|
+
- Input/Output-Pfad → `stride_threat_model.md` + `risk_register.md`
|
|
40
|
+
- Precision/Recall Δ > 5% → `fmea_matrix.md` (RPNs) + `risk_register.md`
|
|
41
|
+
- [ ] **Alle vier Audit-Artefakte existieren noch?** — Kein Löschrisiko?
|
|
42
|
+
|
|
43
|
+
## 5. Befund-Qualität (§13)
|
|
44
|
+
|
|
45
|
+
Nur relevant, wenn die Änderung Analyseergebnisse / Befunde betrifft.
|
|
46
|
+
|
|
47
|
+
- [ ] **Technische Nachvollziehbarkeit?** — Kann ein Dritter den Befund anhand des Codes rekonstruieren?
|
|
48
|
+
- [ ] **Reproduzierbarkeit?** — Liefert dieselbe Eingabe denselben Befund?
|
|
49
|
+
- [ ] **Eindeutige Ursachenzuordnung?** — Ist klar, welche Code-Stelle den Befund auslöst?
|
|
50
|
+
- [ ] **Nachvollziehbare Begründung?** — Steht eine Erklärung, warum dies ein Problem ist?
|
|
51
|
+
- [ ] **Erkennbare nächste Maßnahme?** — Weiß der Empfänger, was zu tun ist?
|
|
52
|
+
|
|
53
|
+
## 6. Code-Qualität
|
|
54
|
+
|
|
55
|
+
- [ ] **Docstrings vorhanden?** — Jede neue öffentliche Funktion unter `src/drift/` hat einen Docstring?
|
|
56
|
+
- [ ] **Keine offensichtlichen Bugs?** — Edge Cases, Off-by-One, Null-Handling geprüft?
|
|
57
|
+
- [ ] **Keine Sicherheitslücken?** — OWASP Top 10 beachtet (Path Traversal, Injection, etc.)?
|
|
58
|
+
- [ ] **Typisierung konsistent?** — mypy-konform, keine unannotierten öffentlichen Signaturen?
|
|
59
|
+
|
|
60
|
+
## 7. Tests
|
|
61
|
+
|
|
62
|
+
- [ ] **Tests vorhanden?** — Gibt es Tests für das neue/geänderte Verhalten?
|
|
63
|
+
- [ ] **Regressionstests?** — Bestehendes Verhalten durch Tests abgesichert?
|
|
64
|
+
- [ ] **Edge Cases abgedeckt?** — Leere Eingaben, Grenzwerte, Fehlerpfade?
|
|
65
|
+
- [ ] **Keine duplizierten Testnamen?** — Kein `def test_...`-Duplikat im selben Modul?
|
|
66
|
+
|
|
67
|
+
## 8. Commit und Gates
|
|
68
|
+
|
|
69
|
+
- [ ] **Conventional Commit korrekt?** — `feat:`, `fix:`, `refactor:`, `docs:`, `test:`, `chore:` passend gewählt?
|
|
70
|
+
- [ ] **CHANGELOG aktualisiert?** — Bei `feat:` oder `fix:`: Eintrag in `CHANGELOG.md` vorhanden?
|
|
71
|
+
- [ ] **Feature-Evidence vorhanden?** — Bei `feat:`: Tests + `benchmark_results/vX.Y.Z_*.json` + `docs/STUDY.md`?
|
|
72
|
+
- [ ] **Lockfile synchron?** — Bei `pyproject.toml`-Änderung: `uv.lock` aktualisiert?
|
|
73
|
+
|
|
74
|
+
## 9. Gesamtbewertung
|
|
75
|
+
|
|
76
|
+
- [ ] **Bekannte Restrisiken benannt?** — Sind Trade-offs oder offene Punkte explizit dokumentiert (nicht verschwiegen)?
|
|
77
|
+
- [ ] **Freigabestatus bestimmt:**
|
|
78
|
+
- `❌ NICHT BEREIT` — offene kritische Issues
|
|
79
|
+
- `⚠️ BEREIT ZUR MENSCHLICHEN PRÜFUNG` — Checks grün, aber Risiken sichtbar
|
|
80
|
+
- `✅ BEREIT ZUM MERGE` — vollständig grün, alle Gates erfüllt
|
|
@@ -0,0 +1,195 @@
|
|
|
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 Test-Checkpoint (Schritt 3b).
|
|
69
|
+
|
|
70
|
+
### Schritt 3b — Test-Checkpoint nach jeder Änderung
|
|
71
|
+
|
|
72
|
+
Nachdem `nudge` kein Degrading meldet, **gezielte Tests** für die geänderte Datei ausführen.
|
|
73
|
+
|
|
74
|
+
**Pfad-zu-Test-Mapping** (kürzeste Match-Regel, oben zuerst):
|
|
75
|
+
|
|
76
|
+
| Geänderte Datei (Pattern) | Gezielte Tests |
|
|
77
|
+
|---|---|
|
|
78
|
+
| `src/drift/signals/architecture_violation*` | `pytest tests/test_avs_*.py -q --tb=short` |
|
|
79
|
+
| `src/drift/signals/doc_impl_drift*` | `pytest tests/test_dia_*.py -q --tb=short` |
|
|
80
|
+
| `src/drift/signals/explainability_deficit*` | `pytest tests/test_eds_*.py -q --tb=short` |
|
|
81
|
+
| `src/drift/signals/mutant_duplicates*` | `pytest tests/test_mutant_duplicates*.py -q --tb=short` |
|
|
82
|
+
| `src/drift/signals/dead_code_accumulation*` | `pytest tests/test_dead_code*.py -q --tb=short` |
|
|
83
|
+
| `src/drift/signals/pattern_fragmentation*` | `pytest tests/test_pattern_fragmentation*.py -q --tb=short` |
|
|
84
|
+
| `src/drift/signals/naming_contract*` | `pytest tests/test_naming_contract*.py -q --tb=short` |
|
|
85
|
+
| `src/drift/signals/test_polarity_deficit*` | `pytest tests/test_test_polarity_deficit*.py -q --tb=short` |
|
|
86
|
+
| `src/drift/signals/cognitive_complexity*` | `pytest tests/test_cognitive_complexity*.py -q --tb=short` |
|
|
87
|
+
| `src/drift/signals/circular_import*` | `pytest tests/test_circular_import*.py -q --tb=short` |
|
|
88
|
+
| `src/drift/signals/guard_clause*` | `pytest tests/test_guard_clause*.py -q --tb=short` |
|
|
89
|
+
| `src/drift/signals/insecure_default*` | `pytest tests/test_insecure_default*.py -q --tb=short` |
|
|
90
|
+
| `src/drift/signals/missing_authorization*` | `pytest tests/test_missing_authorization*.py -q --tb=short` |
|
|
91
|
+
| `src/drift/signals/hardcoded_secret*` | `pytest tests/test_hardcoded_secret*.py -q --tb=short` |
|
|
92
|
+
| `src/drift/signals/exception_contract*` | `pytest tests/test_exception_contract*.py -q --tb=short` |
|
|
93
|
+
| `src/drift/signals/fan_out_explosion*` | `pytest tests/test_fan_out_explosion*.py -q --tb=short` |
|
|
94
|
+
| `src/drift/signals/cohesion_deficit*` | `pytest tests/test_cohesion_deficit*.py -q --tb=short` |
|
|
95
|
+
| `src/drift/signals/bypass_accumulation*` | `pytest tests/test_bypass_accumulation*.py -q --tb=short` |
|
|
96
|
+
| `src/drift/signals/*` (andere) | `pytest tests/test_precision_recall.py tests/test_mirofish_signal_improvements.py -q --tb=short` |
|
|
97
|
+
| `src/drift/api.py` | `pytest tests/test_brief.py tests/test_integration.py tests/test_incremental.py tests/test_fix_actionability.py tests/test_nudge.py -q --tb=short` |
|
|
98
|
+
| `src/drift/mcp_server.py` | `pytest tests/test_mcp_copilot.py tests/test_mcp_hardening.py tests/test_tool_metadata.py tests/test_negative_context_export.py -q --tb=short` |
|
|
99
|
+
| `src/drift/output/*` | `pytest tests/test_json_output.py tests/test_csv_output.py tests/test_sarif_contract.py tests/test_output_golden.py tests/test_agent_tasks.py -q --tb=short` |
|
|
100
|
+
| `src/drift/ingestion/*` | `pytest tests/test_ast_parser.py tests/test_file_discovery.py tests/test_scope_resolver.py tests/test_typescript_parser.py -q --tb=short` |
|
|
101
|
+
| `src/drift/config.py` | `pytest tests/test_config.py tests/test_config_validate.py tests/test_model_consistency.py -q --tb=short` |
|
|
102
|
+
| `src/drift/commands/*` | `pytest tests/test_self_command.py tests/test_patterns_command.py tests/test_ci_reality.py -q --tb=short` |
|
|
103
|
+
| `src/drift/session.py` | `pytest tests/test_session.py -q --tb=short` |
|
|
104
|
+
| `src/drift/incremental.py` | `pytest tests/test_incremental.py tests/test_nudge.py -q --tb=short` |
|
|
105
|
+
| Fallback (kein Treffer) | `pytest tests/ -q --tb=short --ignore=tests/test_smoke_real_repos.py --maxfail=5` |
|
|
106
|
+
|
|
107
|
+
**Bei Testfehlschlag — Entscheidungsbaum:**
|
|
108
|
+
|
|
109
|
+
| Fehlerbild | Ursache | Reaktion |
|
|
110
|
+
|---|---|---|
|
|
111
|
+
| `AttributeError: has no attribute X` | Test prüft Implementation-Details | **Test anpassen** |
|
|
112
|
+
| `TypeError: N arguments expected` | Signatur wurde geändert | **Test anpassen** |
|
|
113
|
+
| Test erwartet altes Drift-Pattern, das absichtlich entfernt wurde | Finding war Ziel des Fixes | **Test anpassen** |
|
|
114
|
+
| `AssertionError` auf dokumentiertes Public-API-Verhalten | Vertrag verletzt | **Production-Fix überdenken oder reverten** |
|
|
115
|
+
| `AssertionError` auf Rückgabewert eines öffentlichen Contracts | Semantische Regression | **Production-Fix überdenken oder reverten** |
|
|
116
|
+
|
|
117
|
+
**Kein Hard-Block:** Der Workflow wird nicht abgebrochen. Der Agent wendet den Entscheidungsbaum an und setzt mit dem bereinigten Zustand fort.
|
|
118
|
+
|
|
119
|
+
### Schritt 4 — Nächsten Task holen (falls nötig)
|
|
120
|
+
|
|
121
|
+
Wenn weitere Findings offen sind:
|
|
122
|
+
|
|
123
|
+
```
|
|
124
|
+
drift_fix_plan(
|
|
125
|
+
session_id="<session_id>",
|
|
126
|
+
max_tasks=1
|
|
127
|
+
)
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
**Immer `max_tasks=1` verwenden.** Das reduziert die Response-Größe und den Parsing-Overhead erheblich.
|
|
131
|
+
|
|
132
|
+
Dann zurück zu Schritt 2.
|
|
133
|
+
|
|
134
|
+
### Schritt 5 — Abschluss-Verifikation
|
|
135
|
+
|
|
136
|
+
Erst wenn alle Tasks bearbeitet sind:
|
|
137
|
+
|
|
138
|
+
```
|
|
139
|
+
drift_diff(
|
|
140
|
+
session_id="<session_id>",
|
|
141
|
+
uncommitted=true
|
|
142
|
+
)
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
Prüfen:
|
|
146
|
+
- `resolved_count` > 0
|
|
147
|
+
- `new_count` == 0
|
|
148
|
+
- Keine Regressionen
|
|
149
|
+
|
|
150
|
+
## Zusammenfassung als Ablaufdiagramm
|
|
151
|
+
|
|
152
|
+
```
|
|
153
|
+
session_start(autopilot=true) ← 1 Aufruf statt 4
|
|
154
|
+
↓
|
|
155
|
+
fix_plan (in Autopilot enthalten)
|
|
156
|
+
↓
|
|
157
|
+
┌──────────────────────────────────────────┐
|
|
158
|
+
│ Task N bearbeiten │
|
|
159
|
+
│ Datei editieren │
|
|
160
|
+
│ nudge(changed_files=...) ← ~0.2 s │
|
|
161
|
+
│ direction prüfen │
|
|
162
|
+
│ ggf. korrigieren │
|
|
163
|
+
│ pytest <gezielte Tests> --tb=short ← 3b│
|
|
164
|
+
│ bei rot: Test anpassen oder reverten │
|
|
165
|
+
└─────────┬────────────────────────────────┘
|
|
166
|
+
│ safe_to_commit + Tests grün?
|
|
167
|
+
↓
|
|
168
|
+
fix_plan(max_tasks=1) ← nächster Task
|
|
169
|
+
│ keine Tasks mehr?
|
|
170
|
+
↓
|
|
171
|
+
drift_diff(uncommitted) ← Abschluss-Verifikation
|
|
172
|
+
↓
|
|
173
|
+
Commit vorbereiten
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
## Anti-Patterns: Was NICHT tun
|
|
177
|
+
|
|
178
|
+
| Anti-Pattern | Problem | Stattdessen |
|
|
179
|
+
|---|---|---|
|
|
180
|
+
| `drift_scan` nach jeder Dateiänderung | Volle Repo-Analyse pro Edit (~3–5 s) | `drift_nudge` verwenden (~0.2 s) |
|
|
181
|
+
| `session_start` ohne `autopilot=true` | 4 separate Roundtrips für validate/brief/scan/fix_plan | `autopilot=true` setzen |
|
|
182
|
+
| `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) |
|
|
183
|
+
| Kein `session_id` weitergeben | Jeder Aufruf verliert Kontext, kein Scope-Carry-Over | Immer `session_id` übergeben |
|
|
184
|
+
| `drift_diff` nach jedem Edit | Teurer als nötig für Zwischenfeedback | `nudge` als Inner-Loop, `diff` nur am Ende |
|
|
185
|
+
| Mehrere Findings gleichzeitig fixen | Unklar welche Änderung welchen Effekt hat | Immer ein Finding pro Iteration |
|
|
186
|
+
|
|
187
|
+
## Verhalten bei `agent_instruction` in Responses
|
|
188
|
+
|
|
189
|
+
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.
|
|
190
|
+
|
|
191
|
+
Zusätzlich gibt `next_tool_call` den konkreten nächsten Tool-Aufruf mit Parametern vor. Wenn vorhanden, diesen bevorzugt verwenden.
|
|
192
|
+
|
|
193
|
+
## Artefakte
|
|
194
|
+
|
|
195
|
+
Dieser Prompt erzeugt keine separaten Artefakte. Die Änderungen sind die Code-Fixes selbst.
|
|
@@ -181,6 +181,40 @@ Key rules:
|
|
|
181
181
|
- Follow `agent_instruction` and `next_tool_call` fields in responses
|
|
182
182
|
- Run `drift_diff` only as final verification, not after every edit
|
|
183
183
|
|
|
184
|
+
### Test-Aware Fix-Loop
|
|
185
|
+
|
|
186
|
+
After each `drift_nudge` call (when `direction` is not degrading), run targeted tests for the changed file **before** requesting the next task.
|
|
187
|
+
|
|
188
|
+
**Why:** `fix_plan`, `nudge`, and `AgentTask` contain no test awareness. The `safe_to_commit` field only evaluates drift delta — not pytest results. Test failures are otherwise only caught at push time by CI Gate 8.
|
|
189
|
+
|
|
190
|
+
**Path-to-test mapping (first match wins):**
|
|
191
|
+
|
|
192
|
+
| Changed file pattern | Run these tests |
|
|
193
|
+
|---|---|
|
|
194
|
+
| `src/drift/signals/architecture_violation*` | `pytest tests/test_avs_*.py -q --tb=short` |
|
|
195
|
+
| `src/drift/signals/doc_impl_drift*` | `pytest tests/test_dia_*.py -q --tb=short` |
|
|
196
|
+
| `src/drift/signals/explainability_deficit*` | `pytest tests/test_eds_*.py -q --tb=short` |
|
|
197
|
+
| `src/drift/signals/mutant_duplicates*` | `pytest tests/test_mutant_duplicates*.py -q --tb=short` |
|
|
198
|
+
| `src/drift/signals/dead_code_accumulation*` | `pytest tests/test_dead_code*.py -q --tb=short` |
|
|
199
|
+
| `src/drift/signals/pattern_fragmentation*` | `pytest tests/test_pattern_fragmentation*.py -q --tb=short` |
|
|
200
|
+
| `src/drift/signals/*` (other) | `pytest tests/test_precision_recall.py tests/test_mirofish_signal_improvements.py -q --tb=short` |
|
|
201
|
+
| `src/drift/api.py` | `pytest tests/test_brief.py tests/test_integration.py tests/test_nudge.py -q --tb=short` |
|
|
202
|
+
| `src/drift/mcp_server.py` | `pytest tests/test_mcp_copilot.py tests/test_mcp_hardening.py tests/test_tool_metadata.py -q --tb=short` |
|
|
203
|
+
| `src/drift/output/*` | `pytest tests/test_json_output.py tests/test_agent_tasks.py tests/test_output_golden.py -q --tb=short` |
|
|
204
|
+
| `src/drift/ingestion/*` | `pytest tests/test_ast_parser.py tests/test_file_discovery.py -q --tb=short` |
|
|
205
|
+
| `src/drift/config.py` | `pytest tests/test_config.py tests/test_config_validate.py -q --tb=short` |
|
|
206
|
+
| `src/drift/session.py` | `pytest tests/test_session.py -q --tb=short` |
|
|
207
|
+
| `src/drift/incremental.py` | `pytest tests/test_incremental.py tests/test_nudge.py -q --tb=short` |
|
|
208
|
+
| Fallback | `pytest tests/ -q --tb=short --ignore=tests/test_smoke_real_repos.py --maxfail=5` |
|
|
209
|
+
|
|
210
|
+
**On test failure — decision tree:**
|
|
211
|
+
|
|
212
|
+
- `AttributeError: has no attribute X` or `TypeError: N arguments expected` → test checks implementation details → **adapt the test**
|
|
213
|
+
- Test expects an old drift pattern that was intentionally removed → **adapt the test**
|
|
214
|
+
- `AssertionError` on documented public API behavior or return value contract → **reconsider or revert the production fix**
|
|
215
|
+
|
|
216
|
+
No hard block: the workflow continues after the decision is applied. Full mapping and decision rules: `.github/prompts/drift-fix-loop.prompt.md` (Schritt 3b).
|
|
217
|
+
|
|
184
218
|
See `.github/prompts/drift-fix-loop.prompt.md` for the detailed workflow.
|
|
185
219
|
|
|
186
220
|
## False Positive Reduction Playbook
|
|
@@ -15,6 +15,12 @@ Guide Copilot agents through a policy-conformant, evidence-based pull request re
|
|
|
15
15
|
- Evaluating signal quality, scoring changes, or output format changes
|
|
16
16
|
- Checking benchmark evidence for new features
|
|
17
17
|
|
|
18
|
+
## Strukturierte Review-Checkliste
|
|
19
|
+
|
|
20
|
+
**Pflicht-Referenz:** Die vollständige Review-Checkliste liegt unter `.github/prompts/_partials/review-checkliste.md`.
|
|
21
|
+
Bei jedem adversarialen Review wird diese Checkliste Punkt für Punkt abgearbeitet.
|
|
22
|
+
Der Reviewer dokumentiert pro Punkt **Ja / Nein / N/A** mit Kurzbegründung.
|
|
23
|
+
|
|
18
24
|
## Review Workflow
|
|
19
25
|
|
|
20
26
|
### Step 1: Policy Gate
|
|
@@ -175,7 +175,7 @@
|
|
|
175
175
|
"filename": "src\\drift\\models.py",
|
|
176
176
|
"hashed_secret": "581318342217e0472a69081affd5f121ad664884",
|
|
177
177
|
"is_verified": false,
|
|
178
|
-
"line_number":
|
|
178
|
+
"line_number": 55
|
|
179
179
|
}
|
|
180
180
|
],
|
|
181
181
|
"src\\drift\\output\\agent_tasks.py": [
|
|
@@ -308,5 +308,5 @@
|
|
|
308
308
|
}
|
|
309
309
|
]
|
|
310
310
|
},
|
|
311
|
-
"generated_at": "2026-04-
|
|
311
|
+
"generated_at": "2026-04-09T16:12:57Z"
|
|
312
312
|
}
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
|
|
10
10
|
### Fixed
|
|
11
11
|
|
|
12
|
+
- Enforce optional strict orchestration guards in MCP session workflows to avoid unsafe autonomous tool-chain progression when strict mode is enabled.
|
|
12
13
|
- Add missing `response_profile` docstring entry in `drift_diff` MCP tool, fixing `test_catalog_parameters_have_descriptions` CI failure.
|
|
13
14
|
- Exclude `.drift-baseline.json` from `detect-secrets` scan — fingerprint hex strings are analysis hashes, not secrets.
|
|
14
15
|
- 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.
|
|
@@ -86,7 +87,15 @@
|
|
|
86
87
|
- 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).
|
|
87
88
|
- `drift self` error guidance now suggests valid next actions (`drift scan`/`drift analyze`) instead of invalid `--repo` flag (#120).
|
|
88
89
|
|
|
89
|
-
## [2.
|
|
90
|
+
## [2.7.1] - 2026-04-09
|
|
91
|
+
|
|
92
|
+
Short version: Align release metadata so release-discipline checks pass.
|
|
93
|
+
|
|
94
|
+
### Changed
|
|
95
|
+
|
|
96
|
+
- Align top changelog release marker with project version `2.7.1` in `pyproject.toml`.
|
|
97
|
+
|
|
98
|
+
## [2.7.0] - 2026-04-09
|
|
90
99
|
|
|
91
100
|
Short version: Signal-filtering for scan, cross-validation fields, and false-positive reductions across multiple signals.
|
|
92
101
|
|
|
@@ -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.
|
|
13
|
-
date-released: "2026-04-
|
|
12
|
+
version: "2.7.1"
|
|
13
|
+
date-released: "2026-04-09"
|
|
14
14
|
keywords:
|
|
15
15
|
- static-analysis
|
|
16
16
|
- architectural-drift
|