drift-analyzer 2.6.2__tar.gz → 2.7.0__tar.gz

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