{"id":47780011,"url":"https://github.com/mick-gsk/drift","last_synced_at":"2026-04-26T14:02:25.948Z","repository":{"id":345375614,"uuid":"1185667515","full_name":"mick-gsk/drift","owner":"mick-gsk","description":"Detect architectural erosion from AI-generated code. Static analyzer for pattern fragmentation, architecture violations \u0026 mutant duplicates.","archived":false,"fork":false,"pushed_at":"2026-04-12T14:24:51.000Z","size":42953,"stargazers_count":7,"open_issues_count":11,"forks_count":9,"subscribers_count":2,"default_branch":"main","last_synced_at":"2026-04-12T14:27:36.241Z","etag":null,"topics":["ai-generated-code","architecture","cli","code-quality","code-review","copilot","developer-tools","github-action","linter","python","static-analysis","technical-debt"],"latest_commit_sha":null,"homepage":"https://mick-gsk.github.io/drift/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mick-gsk.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":"audit_results/fault_trees.md","citation":"CITATION.cff","codeowners":".github/CODEOWNERS","security":"SECURITY.md","support":"SUPPORT.md","governance":null,"roadmap":"ROADMAP.md","authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":".github/AGENTS.md","dco":null,"cla":null},"funding":{"github":["mick-gsk"]}},"created_at":"2026-03-18T20:29:55.000Z","updated_at":"2026-04-12T14:24:07.000Z","dependencies_parsed_at":null,"dependency_job_id":"507e4db2-e5f7-4537-b96a-67cb92705b4f","html_url":"https://github.com/mick-gsk/drift","commit_stats":null,"previous_names":["sauremilk/drift"],"tags_count":98,"template":false,"template_full_name":null,"purl":"pkg:github/mick-gsk/drift","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mick-gsk%2Fdrift","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mick-gsk%2Fdrift/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mick-gsk%2Fdrift/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mick-gsk%2Fdrift/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mick-gsk","download_url":"https://codeload.github.com/mick-gsk/drift/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mick-gsk%2Fdrift/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31922399,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-16T18:22:33.417Z","status":"online","status_checked_at":"2026-04-17T02:00:06.879Z","response_time":62,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai-generated-code","architecture","cli","code-quality","code-review","copilot","developer-tools","github-action","linter","python","static-analysis","technical-debt"],"created_at":"2026-04-03T13:03:08.535Z","updated_at":"2026-04-17T09:01:47.392Z","avatar_url":"https://github.com/mick-gsk.png","language":"Python","funding_links":["https://github.com/sponsors/mick-gsk"],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n\u003cimg src=\"https://raw.githubusercontent.com/mick-gsk/drift/main/docs/assets/banner.svg\" alt=\"drift — steer your agent before it ships\" width=\"900\"\u003e\n\n# Drift\n\n**Your architecture is drifting. Your linter won't tell you. Drift will.**\n\n24 cross-file signals · 100 % ground-truth precision · deterministic, no LLM · ~30 s for a 2 900-file codebase\n\n```bash\npip install drift-analyzer\ndrift setup          # 3-question wizard: picks the right profile for your project\ndrift status         # traffic-light health check — your daily entry point\n```\n\n\u003cimg src=\"https://raw.githubusercontent.com/mick-gsk/drift/main/demos/demo.gif\" alt=\"drift analyze — Rich terminal output showing structural findings\" width=\"720\"\u003e\n\n[![CI](https://github.com/mick-gsk/drift/actions/workflows/ci.yml/badge.svg)](https://github.com/mick-gsk/drift/actions/workflows/ci.yml)\n[![Drift Score](https://img.shields.io/badge/drift%20score-0.50-yellow?style=flat)](benchmark_results/drift_self.json)\n[![codecov](https://codecov.io/gh/mick-gsk/drift/branch/main/graph/badge.svg)](https://codecov.io/gh/mick-gsk/drift)\n[![PyPI](https://img.shields.io/pypi/v/drift-analyzer?cacheSeconds=300)](https://pypi.org/project/drift-analyzer/)\n[![PyPI Downloads](https://img.shields.io/pypi/dm/drift-analyzer)](https://pypi.org/project/drift-analyzer/)\n[![Python versions](https://img.shields.io/pypi/pyversions/drift-analyzer)](https://pypi.org/project/drift-analyzer/)\n[![GitHub Stars](https://img.shields.io/github/stars/mick-gsk/drift?style=flat)](https://github.com/mick-gsk/drift/stargazers)\n[![License](https://img.shields.io/github/license/mick-gsk/drift)](LICENSE)\n[![Discussions](https://img.shields.io/github/discussions/mick-gsk/drift)](https://github.com/mick-gsk/drift/discussions)\n\n[Docs](https://mick-gsk.github.io/drift/) · [Quick Start](https://mick-gsk.github.io/drift/getting-started/quickstart/) · [Benchmarking](https://mick-gsk.github.io/drift/benchmarking/) · [Trust \u0026 Limitations](https://mick-gsk.github.io/drift/trust-evidence/)\n\n\u003c/div\u003e\n\n---\n\n## ⚡ Try it — zero install\n\n```bash\nuvx drift-analyzer analyze --repo .\n```\n\n\u003e One command. No pre-install. Results in ~30 seconds.\n\n🌐 **No install at all?** [Analyze any public repo in your browser →](https://mick-gsk.github.io/drift/prove-it/)\n\n**Permanent install:** `pip install drift-analyzer` · Python 3.11+ · also via [pipx, Homebrew, Docker, GitHub Action, pre-commit →](https://mick-gsk.github.io/drift/getting-started/installation/)\n\n| Metric | Value | Evidence |\n|---|---|---|\n| Ground-truth precision | **100 %** (47 TP, 0 FP) | [v2.7.0 baseline](benchmark_results/v2.7.0_precision_recall_baseline.json) |\n| Ground-truth recall | **100 %** (0 FN, 114 fixtures) | [v2.7.0 baseline](benchmark_results/v2.7.0_precision_recall_baseline.json) |\n| Mutation recall | **100 %** (25/25 injected) | [mutation benchmark](benchmark_results/mutation_benchmark.json) |\n| Wild-repo precision | **77–95 %** (5 repos) | [study §5](https://github.com/mick-gsk/drift/blob/main/docs/STUDY.md) |\n\n\u003e [!NOTE]\n\u003e **Drift eats its own dog food.** Every release runs `drift self` on its own source — same pipeline, same rules, no exceptions. Results: [drift_self.json](benchmark_results/drift_self.json)\n\n---\n\n## 🤔 Why drift?\n\nMost linters catch single-file style issues. Drift catches what they miss:\ncross-file structural drift that accumulates silently during AI-assisted development.\n\n\u003ctable\u003e\n\u003ctr\u003e\u003cth\u003eWithout Drift\u003c/th\u003e\u003cth\u003eWith Drift\u003c/th\u003e\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\n\n- Agent duplicates a helper in 3 modules — tests pass\n- Layer boundary violated in a refactor — CI green\n- Auth middleware reimplemented 4 ways — linter silent\n- Score degrades over weeks — nobody notices\n\n\u003c/td\u003e\n\u003ctd\u003e\n\n- `drift brief` injects structural guardrails *before* the agent writes code\n- `drift nudge` flags new violations in real-time during the session\n- `drift check` blocks the commit on high-severity findings\n- `drift trend` tracks score evolution — regressions are visible\n\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/table\u003e\n\n\u003e 🔍 **Before** — `drift brief` analyses your repo scope and generates structural constraints ready to paste into your agent prompt  \n\u003e 🚦 **After** — `drift check` runs 20+ cross-file signals and exits 1 on violations — CI, SARIF, and pre-commit ready  \n\u003e 🧠 **Over time** — Bayesian calibration reweights signals via feedback, git outcome correlation, and GitHub label correlation\n\n---\n\n## ⚙️ How it works\n\n**Before a session — generate guardrails:**\n\n```bash\ndrift brief --task \"refactor the auth service\" --format markdown\n# → paste output into your agent prompt before delegation\n```\n\n**After a session — enforce structure:**\n\n```bash\ndrift check --fail-on high         # local or CI gate\ndrift check --fail-on none         # pre-commit hook (advisory, report-only)\ndrift analyze --repo . --format json  # full report\n```\n\n📖 [Full workflow guide →](https://mick-gsk.github.io/drift/getting-started/quickstart/)\n\n\u003e [!TIP]\n\u003e **Best fit:** Python repos with 20+ files and active AI-assisted development.  \n\u003e Tiny repos produce noisy scores. Drift does not replace your linter, type checker, or security scanner — it covers the layer they cannot: cross-file structural coherence over time.\n\n---\n\n## 🔌 Works with\n\n| AI Tools (MCP) | CI/CD | Git Hooks | Install |\n|:---:|:---:|:---:|:---:|\n| Cursor · Claude Code · Copilot | GitHub Actions · SARIF | pre-commit · pre-push | pip · pipx · uvx · Homebrew · Docker |\n\n\u003e **Bootstrap everything:** `drift init --mcp --ci --hooks` scaffolds config for all integrations in one command.\n\n### GitHub Actions\n\n[![Available on GitHub Marketplace](https://img.shields.io/badge/Marketplace-Drift-orange?logo=github)](https://github.com/marketplace/actions/drift-ai-code-coherence-monitor)\n\n```yaml\n# Try it — add this to .github/workflows/drift.yml\nname: Drift\non: [push, pull_request]\njobs:\n  drift:\n    runs-on: ubuntu-latest\n    permissions:\n      security-events: write   # for SARIF upload\n      pull-requests: write     # for PR comments\n    steps:\n      - uses: actions/checkout@v4\n        with:\n          fetch-depth: 0       # full history for temporal signals\n      - uses: mick-gsk/drift@v1\n        with:\n          fail-on: none        # report-only — tighten once you trust the output\n          upload-sarif: \"true\" # findings appear as PR annotations\n          comment: \"true\"      # summary comment on each PR\n```\n\n**Outputs available** for downstream steps: `drift-score`, `grade`, `severity`, `finding-count`, `badge-svg`\n\n### MCP / AI Tools\n\nCursor, Claude Code, and Copilot call drift directly via MCP server — the agent runs a full session loop:\n\n| Phase | MCP Tool | What it does |\n|---|---|---|\n| **Plan** | `drift_brief` | Scope-aware guardrails injected into the agent prompt |\n| **Code** | `drift_nudge` | Real-time `safe_to_commit` check after each edit |\n| **Verify** | `drift_diff` | Full before/after comparison before push |\n| **Learn** | `drift_feedback` | Mark findings as TP/FP — calibrates signal weights |\n\n#### Copy-paste MCP config\n\n**VS Code** — add to `.vscode/mcp.json`:\n\n```json\n{\n  \"servers\": {\n    \"drift\": {\n      \"type\": \"stdio\",\n      \"command\": \"drift\",\n      \"args\": [\"mcp\", \"--serve\"]\n    }\n  }\n}\n```\n\n**Claude Desktop** — add to `claude_desktop_config.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"drift\": {\n      \"command\": \"drift\",\n      \"args\": [\"mcp\", \"--serve\"]\n    }\n  }\n}\n```\n\n**Cursor** — add to `.cursor/mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"drift\": {\n      \"type\": \"stdio\",\n      \"command\": \"drift\",\n      \"args\": [\"mcp\", \"--serve\"]\n    }\n  }\n}\n```\n\nOr auto-generate: `pip install drift-analyzer[mcp] \u0026\u0026 drift init --mcp`\n\n📖 [MCP setup guide →](https://mick-gsk.github.io/drift/integrations/)\n\n**pre-commit:** Add `drift diff --staged-only` as a hook — findings block the commit before they reach CI.\n\n📖 [Full integration guide →](https://mick-gsk.github.io/drift/integrations/)\n\n---\n\n## 🎛️ Configuration profiles\n\nPick a profile that matches your project — or start with `default` and calibrate later:\n\n| Profile | Best for | Command |\n|---|---|---|\n| **default** | Most projects | `drift init` |\n| **vibe-coding** | AI-heavy codebases (Copilot, Cursor, Claude) | `drift init -p vibe-coding` |\n| **strict** | Mature projects, zero tolerance | `drift init -p strict` |\n| **fastapi** | Web APIs with router/service/DB layers | `drift init -p fastapi` |\n| **library** | Reusable PyPI packages | `drift init -p library` |\n| **monorepo** | Multi-package repos | `drift init -p monorepo` |\n| **quick** | First exploration, demos | `drift init -p quick` |\n\n\u003e **Team workflow:** Commit `drift.yaml` to your repo → CI enforces the same thresholds → team inherits calibrated weights.\n\n📖 [Profile gallery with full details →](https://mick-gsk.github.io/drift/guides/configuration-profiles/) · [Configuration reference →](https://mick-gsk.github.io/drift/getting-started/configuration/)\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eAdvanced: Adaptive learning, Negative context library, Guided mode\u003c/b\u003e\u003c/summary\u003e\n\n### Adaptive learning \u0026 calibration\n\nDrift does not treat all signals equally forever. It maintains a per-repo profile:\n\n- **Bayesian calibration engine** combines three evidence sources: explicit `drift feedback mark`, git outcome correlation, and GitHub issue/PR label correlation.\n- **Feedback events** are stored as structured `FeedbackEvent` records and can be reloaded and replayed across versions (`record_feedback`, `load_feedback`).\n- **Profile builder** (`build_profile`) produces a calibrated weight profile that `drift check` and `drift brief` use to focus on the most trusted signals in your codebase.\n\nCLI surface: `drift feedback`, `drift calibrate`, `drift precision` (for your own ground-truth checks).\n\n### Negative context library for agents\n\nDrift can turn findings into a structured \"what NOT to do\" library for coding agents:\n\n- **Per-signal generators** map each signal (PFS, MDS, AVS, BEM, TPD, …) to one or more `NegativeContext` items with category, scope, rationale, and confidence.\n- **Anti-pattern IDs** like `neg-MDS-…` are deterministic and stable — ideal for referencing in policies and prompts.\n- **Forbidden vs. canonical patterns**: each item includes a concrete anti-pattern code block and a canonical alternative, often tagged with CWE and FMEA RPN.\n- **Security-aware**: mappings for `MISSING_AUTHORIZATION`, `HARDCODED_SECRET`, and `INSECURE_DEFAULT` generate explicit security guardrails for agents.\n\nAPI: `findings_to_negative_context()` and `negative_context_to_dict()` deliver agent-consumable JSON for `drift_nudge`, `drift brief`, and other tools.\n\n### Guided mode for vibe-coding teams\n\nIf your team ships most changes via AI coding tools (Copilot, Cursor, Claude), drift includes a guided mode:\n\n- **CLI guide**: `drift start` prints the three-command journey for new users: `analyze → fix-plan → check` with safe defaults.\n- **Vibe-coding playbook**: [examples/vibe-coding/README.md](examples/vibe-coding/README.md) documents a 30-day rollout plan (IDE → commit → PR → merge → trend) with concrete scripts and metrics.\n- **Problem-to-signal map**: maps typical vibe-coding issues (duplicate helpers, boundary erosion, happy-path-only tests, type-ignore buildup) directly to signals like MDS, PFS, AVS, TPD, BAT, CIR, CCC.\n- **Baseline + ratchet**: ready-made `drift.yaml`, CI gate, pre-push hook and weekly scripts implement a ratcheting quality gate over time.\n\n📖 **Start here if you are a heavy AI-coding user:** [Vibe-coding technical debt solution →](examples/vibe-coding/README.md)\n\n\u003c/details\u003e\n\n---\n\n## 🔄 Coming from another tool?\n\n**From Ruff / pylint:** Drift operates one layer above single-file style. It detects when AI generates the same error handler four different ways across modules — something no linter sees.\n\n**From Semgrep / CodeQL:** Semgrep finds known vulnerability patterns in single files. Drift finds structural erosion across files — pattern fragmentation, layer violations, temporal volatility — that security scanners don't target.\n\n**From SonarQube:** Drift runs locally with zero server setup and produces deterministic, reproducible findings per signal. Add it alongside SonarQube — not instead.\n\n**From jscpd / CPD:** Drift's duplicate detection is AST-level, not text-level. It finds near-duplicates that text diff misses and places them in architectural context.\n\n### Capability comparison\n\n| Capability | drift | SonarQube | Ruff / pylint / mypy | Semgrep / CodeQL | jscpd / CPD |\n|---|:---:|:---:|:---:|:---:|:---:|\n| Pattern Fragmentation across modules | ✔ | — | — | — | — |\n| Near-Duplicate Detection (AST-level) | ✔ | Partial (text) | — | — | ✔ (text) |\n| Architecture Violation signals | ✔ | Partial | — | Partial (custom rules) | — |\n| Temporal / change-history signals | ✔ | — | — | — | — |\n| GitHub Code Scanning via SARIF | ✔ | ✔ | — | ✔ | — |\n| Bayesian per-repo calibration | ✔ | — | — | — | — |\n| MCP server for AI agents | ✔ | — | — | — | — |\n| Zero server setup | ✔ | — | ✔ | ✔ | ✔ |\n| TypeScript support | Partial ¹ | ✔ | — | ✔ | ✔ |\n\n✔ = within primary design scope · — = not a primary design target · Partial = limited coverage\n\n¹ Via `drift-analyzer[typescript]`. 17/24 signals supported via tree-sitter. Python is the primary analysis target.\n\nComparison reflects primary design scope per [STUDY.md §9](https://github.com/mick-gsk/drift/blob/main/docs/STUDY.md).\n\n---\n\n## 🏷️ Add a drift badge to your README\n\nShow your repo's drift score with a shields.io badge:\n\n```bash\ndrift badge                    # prints URL + Markdown snippet\ndrift badge --format svg -o badge.svg  # self-contained SVG\n```\n\nPaste the Markdown output into your README:\n\n```markdown\n[![Drift Score](https://img.shields.io/badge/drift%20score-12.50-brightgreen?style=flat)](https://github.com/mick-gsk/drift)\n```\n\n**Automate in CI:** The [GitHub Action](https://github.com/marketplace/actions/drift-ai-code-coherence-monitor) exposes a `badge-svg` output — pipe it into your repo or a dashboard.\n\n---\n\n## 📚 Documentation\n\n| Topic | Description |\n|---|---|\n| [Quick Start](https://mick-gsk.github.io/drift/getting-started/quickstart/) | Install → first findings in 2 minutes |\n| [Brief \u0026 Guardrails](https://mick-gsk.github.io/drift/integrations/) | Pre-task agent workflow |\n| [CI Integration](https://mick-gsk.github.io/drift/getting-started/team-rollout/) | GitHub Action, SARIF, pre-commit, progressive rollout |\n| [Signal Reference](https://mick-gsk.github.io/drift/algorithms/signals/) | All 25 signals with detection logic |\n| [Benchmarking \u0026 Trust](https://mick-gsk.github.io/drift/benchmarking/) | Precision/Recall, methodology, artifacts |\n| [MCP \u0026 AI Tools](https://mick-gsk.github.io/drift/integrations/) | Cursor, Claude Code, Copilot, HTTP API |\n| [Configuration](https://mick-gsk.github.io/drift/getting-started/configuration/) | drift.yaml, layer boundaries, signal weights |\n| [Configuration Levels](https://mick-gsk.github.io/drift/guides/configuration-levels/) | Zero-Config → Preset → YAML → Calibration → MCP → CI |\n| [Calibration \u0026 Feedback](https://mick-gsk.github.io/drift/algorithms/scoring/) | Bayesian signal reweighting, feedback workflow |\n| [Vibe-coding Playbook](examples/vibe-coding/README.md) | 30-day rollout guide for AI-heavy teams |\n| [Contributing](CONTRIBUTING.md) | Dev setup, FP/FN reporting, signal development |\n\n---\n\n## 🤝 Contributing\n\nDrift's biggest blind spots are found by people running it on codebases the maintainers have never seen. A well-documented false positive can be more valuable than a new feature.\n\n| I want to… | Go here |\n|---|---|\n| Ask a usage question | [Discussions](https://github.com/mick-gsk/drift/discussions) |\n| Report a false positive / false negative | [FP/FN template](https://github.com/mick-gsk/drift/issues/new?template=false_positive.md) |\n| Report a bug | [Bug report](https://github.com/mick-gsk/drift/issues/new?template=bug_report.md) |\n| Suggest a feature | [Feature request](https://github.com/mick-gsk/drift/issues/new?template=feature_request.md) |\n| Propose a contribution before coding | [Contribution proposal](https://github.com/mick-gsk/drift/issues/new?template=contribution_proposal.md) |\n| Report a security vulnerability | [SECURITY.md](SECURITY.md) — not a public issue |\n\n```bash\ngit clone https://github.com/mick-gsk/drift.git \u0026\u0026 cd drift \u0026\u0026 make install\nmake test-fast\n```\n\n\u003cdiv align=\"center\"\u003e\n  \u003ca href=\"https://github.com/mick-gsk/drift/graphs/contributors\"\u003e\n    \u003cimg src=\"https://contrib.rocks/image?repo=mick-gsk/drift\u0026max=64\" alt=\"Contributors\" /\u003e\n  \u003c/a\u003e\n\u003c/div\u003e\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md) · [ROADMAP.md](ROADMAP.md)\n\n---\n\n## 🔒 Trust and limitations\n\nDrift's pipeline is deterministic and benchmark artifacts are published in the repository — claims can be inspected, not just trusted.\n\n| Metric | Value | Artifact |\n|---|---|---|\n| Ground-truth precision | 100 % (47 TP, 0 FP) | [v2.7.0 baseline](benchmark_results/v2.7.0_precision_recall_baseline.json) |\n| Ground-truth recall | 100 % (0 FN across 114 fixtures) | [v2.7.0 baseline](benchmark_results/v2.7.0_precision_recall_baseline.json) |\n| Mutation recall | 100 % (25/25 injected patterns) | [mutation benchmark](benchmark_results/mutation_benchmark.json) |\n| Wild-repo precision | 77 % strict / 95 % lenient (5 repos) | [study §5](https://github.com/mick-gsk/drift/blob/main/docs/STUDY.md) |\n\n- **No LLM in detection.** Same input, same output. Reproducible in CI and auditable.\n- **Single-rater caveat:** ground-truth classification is not yet independently replicated.\n- **Small-repo noise:** repositories with few files can produce noisy scores. Calibration mitigates but does not eliminate this.\n- **Temporal signals** depend on clone depth and git history quality.\n- **The composite score is orientation, not a verdict.** Interpret deltas via `drift trend`, not isolated snapshots.\n\nFull methodology: [Benchmarking \u0026 Trust](https://mick-gsk.github.io/drift/benchmarking/) · [Full Study](https://github.com/mick-gsk/drift/blob/main/docs/STUDY.md)\n\n---\n\n## ⭐ Star History\n\n\u003cdiv align=\"center\"\u003e\n\n[![Star History Chart](https://api.star-history.com/svg?repos=mick-gsk/drift\u0026type=Date)](https://www.star-history.com/#mick-gsk/drift\u0026Date)\n\n\u003c/div\u003e\n\n---\n\n## 📄 License\n\nMIT. See [LICENSE](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmick-gsk%2Fdrift","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmick-gsk%2Fdrift","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmick-gsk%2Fdrift/lists"}