Skip to main content

Code quality drift monitor for AI-generated code

Project description

DriftLens

AI coding agents make you faster. DriftLens makes sure they don't make your code worse.

PyPI version Python versions Tests License: MIT

AI agents write code at superhuman speed — but SlopCodeBench (arXiv:2603.24755) shows they produce 2.2x more verbose code than humans, and code quality degrades in 80% of agentic trajectories. DriftLens catches this drift before it ships: baseline your codebase, then score every change against it.


Quick start (30 seconds)

pip install driftlens
cd your-project
driftlens init        # snapshot current state as baseline
driftlens report      # score drift since baseline

What it measures

DriftLens tracks four structural signals, all computed from the AST — no regex, no LLM calls.

Metric What it captures
Verbosity ratio Lines per logical operation — AI agents pad code with redundant assignments, dead branches, and over-commented obvious logic
Structural similarity Cosine distance between AST fingerprints — catches wholesale rewrites that preserve behavior but destroy architecture
Complexity concentration Gini coefficient over cyclomatic complexity — flags when complexity pools into a few giant functions instead of staying distributed
Naming consistency Identifier entropy and length distribution — detects drift toward generic names (data, result, tmp) or absurdly verbose ones

These four signals are combined into a single composite drift score (0–100). Higher = more drift from your baseline.


CLI commands

Command Description
driftlens init Snapshot the current codebase as the baseline
driftlens score Print the composite drift score (0–100)
driftlens report Full breakdown — per-metric scores with Rich table output
driftlens ci Exit 1 if drift score exceeds threshold (for CI gates)

CI/CD integration

Drop this into any GitHub Actions workflow to gate PRs on drift:

- uses: Su760/driftlens@main
  with:
    threshold: "40"

DriftLens will fail the job if the composite drift score exceeds the threshold, printing a breakdown so you know exactly which metric regressed.

Full workflow example:

name: Drift check
on: [pull_request]

jobs:
  drift:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0
      - uses: Su760/driftlens@main
        with:
          threshold: "40"

Severity levels

Score Severity Meaning
0–15 Healthy Code is consistent with baseline
16–35 Mild Minor drift; worth a second look
36–60 Significant Structural changes detected; review carefully
61–100 Critical Major drift; likely AI-introduced degradation

How it works

Step 1 — Baseline. driftlens init walks your source tree, computes the four metrics for every Python file, and saves a JSON snapshot in .driftlens/baseline.json. This snapshot is your ground truth.

Step 2 — Drift detection. On every subsequent run, DriftLens recomputes the same metrics and compares them against the snapshot. Each metric returns a normalized delta (0–1), where 0 means identical and 1 means maximum measurable deviation.

Step 3 — Scoring. The four deltas are combined into a composite score using fixed weights:

score = 0.30 × verbosity + 0.30 × structure + 0.25 × complexity + 0.15 × naming

The result is scaled to 0–100. Verbosity and structure carry the most weight because they are the primary failure modes documented in SlopCodeBench.

All metrics are AST-based. DriftLens never calls an LLM, never sends your code anywhere, and produces deterministic results. A CI run that passes locally will pass remotely.


Contributing

Pull requests are welcome. Before opening one:

  1. Run pytest tests/ -v — all tests must pass
  2. Do not modify files in tests/fixtures/ — they are calibrated ground truth
  3. New metrics follow the same pattern: analyze_*compute_*compare_*

See CONTRIBUTING.md for more detail.


License

MIT — see LICENSE.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

driftlens_ai-0.1.1.tar.gz (23.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

driftlens_ai-0.1.1-py3-none-any.whl (18.2 kB view details)

Uploaded Python 3

File details

Details for the file driftlens_ai-0.1.1.tar.gz.

File metadata

  • Download URL: driftlens_ai-0.1.1.tar.gz
  • Upload date:
  • Size: 23.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for driftlens_ai-0.1.1.tar.gz
Algorithm Hash digest
SHA256 64a881f0c0784e985354cf6a7ea61526e6a8465e7a56d77ec9d3134c3905d9ac
MD5 c6e2815172a5b1b342e1e57e75dc2f50
BLAKE2b-256 f517494e86964c11fdae711298ba66621da12f0711bfcc5f4f6191312c2b0864

See more details on using hashes here.

Provenance

The following attestation bundles were made for driftlens_ai-0.1.1.tar.gz:

Publisher: publish.yml on Su760/driftlens

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file driftlens_ai-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: driftlens_ai-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 18.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for driftlens_ai-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 3e895aa3c086d88b198e3680b9ce616cfa53c78f48e846e8a51ef883079bf458
MD5 a6ac6dda860ffba994728f880b791928
BLAKE2b-256 1539bac7effc8faacc0990c8b8755ca3d4f8d2810fb79768cfa56d4096cf4315

See more details on using hashes here.

Provenance

The following attestation bundles were made for driftlens_ai-0.1.1-py3-none-any.whl:

Publisher: publish.yml on Su760/driftlens

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page