Find AI-generated code that looks finished but isn't.
Catches what a normal linter passes over: empty functions with real-looking bodies, imports of things that don't exist, pipelines wired to nothing, copy-pasted logic, and docs that oversell what the code actually does.
Runs fully offline · deterministic core scoring · no API key, no model download, nothing leaves your machine.
Release track
- Stable tag:
v3.8.9 - Previous stable tag:
v3.8.8 v3.8.9makes the analysis boundary inspectable: project reports now show finding totals, severity, scan coverage, and ML capability state;--include-testsis explicit; strictness controls reduce covered intentional clone/placeholder false positives; and Rust discovery is parity-checked against Python discovery.v3.8.8tightened packaging metadata and VS Code workflow reliability.
Navigation: What Is It? • Why Not a Linter? • When Not to Use • Quick Start • Verification • Boundaries • How It Works • Document Map • What It Detects • Scoring • Key Features • Calibration • Security • CI/CD • Config • VS Code • Roadmap • Changelog • Release Notes • Schema Validation
AI-SLOP Detector is an evidence-based static analyzer that targets the specific defect class AI code generation reliably produces: structurally plausible code that is functionally empty, disconnected, or misleading.
General linters flag style and convention. This tool flags structural risk.
- 27 checks for "fake-done" code — empty stubs, imports that don't resolve, dead pipelines, copy-paste clones, and buzzword-padded docs
- One 0–100 risk score per file — four measurements are combined so one bad dimension can't be hidden behind good ones (weighted geometric mean of logic density, jargon inflation, dependency use, and critical severity)
- Can adapt review sensitivity locally — repository-scoped history can tune weights after 10 multi-run files when the confidence guard passes and an existing config is present. This is operational calibration, not external validation.
- Tells real changes from noise — uses your commit history so a score drifting a point or two isn't mistaken for a real regression
- Knows your project type —
--initdetects the domain (web API, data/ML, numerical, CLI, library, bio, finance, or general) and picks sensible defaults; override with--domain - Python first, JS/TS and Go optional — install the
[js]or[go]extra to scan those files too - Drops into CI — soft / hard / quarantine gates, GitHub Actions ready
- VS Code extension — inline warnings as you type, score in the status bar
Ruff, pylint, ESLint, and SonarQube primarily check syntax, style, and general static-quality rules. They'll happily pass code that follows every rule and still does nothing — which is exactly what AI assistants tend to produce. This tool checks the other half: does the code actually do what it claims?
| Can it catch... | ruff / pylint / SonarQube | AI-SLOP Detector |
|---|---|---|
| Style, formatting, syntax | Yes | No (not its job) |
| An empty function with a real-looking body or fake return | No | Yes |
| A module imported but never actually used downstream | Partial (unused-import) | Yes (usage ratio) |
| A handler or pipeline that's defined but never wired in | No | Yes |
| Docs or comments that oversell what the code does | No | Yes |
| Copy-pasted duplicate functions across files | Partial | Partial (exact duplicates) |
| Runs offline, no API key, deterministic core score | Yes | Yes |
Use a linter for correctness-of-form. Use this for "is this code real, or just plausible-looking." The two are complementary — run both.
- You want style or formatting enforcement — use ruff / black / ESLint. This tool ignores style on purpose.
- You need a runtime correctness guarantee — a low score means cleaner structure, not that the code works. Keep your tests.
- Your code isn't Python, JS/TS, or Go — other languages aren't analyzed yet.
- You expect calibrated thresholds on day one — the first runs are un-calibrated and only begin to accumulate repository-specific calibration evidence after ~10 multi-run files. Treat early findings as leads, not verdicts.
No project-side config needed. Run it against any folder of Python:
pip install "ai-slop-detector>=3.8.9"
slop-detector --project . --json --output slop.json
python -c "import json; d=json.load(open('slop.json',encoding='utf-8')); print(d['overall_status'], d['weighted_deficit_score'])"Expected output for a healthy project: clean 0.0 to clean 30.0. clean
describes the weighted deficit band only; inspect finding_summary,
scan_coverage, and ml_scoring before treating it as a complete project
assessment. The --output
form writes UTF-8 (no BOM) directly to disk, so it is safe under Windows
PowerShell — prefer it to > slop.json redirection.
pip install "ai-slop-detector>=3.8.9"
slop-detector scan . # canonical analysis entry
slop-detector review . --json # canonical changed-code review
slop-detector pulse . --json # canonical repo health view
slop-detector sweep dead-code . --json # canonical cleanup family
# legacy / compatible surface
slop-detector --init # bootstrap baseline .slopconfig.yaml + .gitignore
slop-detector --init --adaptive-init --init-preview
slop-detector --init --adaptive-init --apply-init-suggestions
slop-detector mycode.py # single file
slop-detector --project ./src # entire project
slop-detector --project . --include-tests # include only default-excluded test files
slop-detector --project . --json --output slop.json # machine-readable output (Windows-safe)
slop-detector --project . --ci-mode hard --ci-report # CI gate
# Optional extras
pip install "ai-slop-detector[js]" # JS/TS tree-sitter analysis
pip install "ai-slop-detector[go]" # Go tree-sitter analysis
# Thin npm wrapper (delegates to the Python CLI)
npm install --save-dev ai-slop-detector
# or: pnpm add -D ai-slop-detector / yarn add -D ai-slop-detector / bun add -d ai-slop-detector
# Python backend still required
pip install ai-slop-detector
npx ai-slop-detector scan .
npx ai-slop-detector review . --format json
npx ai-slop-detector pulse . --format json
npx ai-slop-detector sweep dead-code . --format json
npx ai-slop-detector mcp
# Typed output contract
import type { ReviewOutput, ScanOutput } from "ai-slop-detector/types"
# Programmatic Node API
import { scanProject, reviewChanges, computeHealth, runCleanupFamily } from "ai-slop-detector"
# Local impact story
slop-detector impact enable .
slop-detector impact .
# Telemetry controls (default: off)
slop-detector telemetry status
slop-detector telemetry inspect --example
# Local wrapper development
cd npm-wrapper
node ./bin/ai-slop-detector.js --version
# No install required
uvx ai-slop-detector mycode.pyThe npm surface is intentionally thin:
- it does not reimplement analysis logic
- it delegates into the Python CLI/runtime
- it exists for Node-first teams that want
npx-style entry without changing product semantics - it requires a Python backend and discovers it in this order:
AI_SLOP_DETECTOR_EXECUTABLE-> activeVIRTUAL_ENV-> PATH executables ->python -m slop_detector.cli - it ships version-pinned TypeScript interfaces at
ai-slop-detector/types - it exports a small async Node API for
scanProject,reviewChanges,computeHealth, andrunCleanupFamily
Windows / PowerShell tip: PowerShell
>redirection writes UTF-16 LE or UTF-8 with BOM by default, which breaksjson.load(..., encoding='utf-8'). Use--output <path>instead — it writes UTF-8 bytes (no BOM) directly, skipping the shell.
Use the same verification surface the repository exposes in CI:
pip install -e ".[dev]"
python -m pytest -q
ruff check src tests
python -m buildGovernance verification is a separate enforcement gate:
slop-detector verify-governance ./.cr-epSee docs/GOVERNANCE.md for the artifact contract and policy checks.
Operational review commands live on the same CLI entry point:
slop-detector review . --json
slop-detector pulse . --json
slop-detector sweep dead-code . --json
slop-detector sweep dupes . --json
slop-detector sweep unused-deps . --json
slop-detector sweep boundary-violations . --json
slop-detector watch . --follow
slop-detector explain dead-codeLegacy command forms such as audit, health, and direct cleanup-family names
remain supported for compatibility, but scan / review / pulse / sweep are the
preferred stable surface.
Cleanup-family semantics are now more operational than a raw candidate list:
dead-code,dupes,unused-deps,stale-suppressions, andboundary-violationsemitconfidence,action_class, andevidenceunused-depsincludes project-manifest findings such asmanifest_unused_dependencyandundeclared_importboundary-violationsstays cycle-only by default and only enables layered boundary review when architecture rules are explicitly configured
Agent tooling can use the same semantics over MCP stdio:
slop-detector mcp
# or
slop-mcpAdoption and observability surfaces are intentionally separate from scoring:
slop-detector impacttracks local, gitignored repository progress in.slop-detector/impact.jsonslop-detector telemetrystays default-off and only builds anonymized payloads;AI_SLOP_DETECTOR_TELEMETRY=inspectprints a real payload without queueing it
- This repository measures static code and documentation signals. It does not prove runtime correctness.
- The default scoring path is deterministic; it does not require an LLM or external API.
- JS/TS and Go support are optional extras with language-specific analyzers and fallbacks.
- Optional Rust acceleration is available for file discovery and glob matching when a compiled
rust/slop_scanhelper is present; otherwise the Python walker remains the fallback. - Narrow framework-aware masking is enabled for test boilerplate (pytest no-op hooks, test-harness console/no-op hooks in JS/TS) and never masks
criticalfindings. - A low deficit score is evidence of cleaner structure, not a guarantee that the code is complete or safe.
flowchart LR
A[📄 Source File] --> R[FileRole\nClassifier]
R --> B[AST Parser]
B --> C[27 Pattern Checks]
B --> D[LDR · ICR · DDC\n+ Purity Metrics]
C --> E[GQG Scorer\nWeighted Geometric Mean]
D --> E
E --> F{deficit_score}
F -->|< 30| G[✅ CLEAN]
F -->|30–50| H[⚠️ SUSPICIOUS]
F -->|50–70| I[🔶 INFLATED_SIGNAL]
F -->|≥ 70| J[🚨 CRITICAL_DEFICIT]
E --> H2[history.db]
H2 --> K[Self-Calibrator\nauto-tune weights]
Every file goes through four independent measurement axes (LDR, ICR, DDC, Purity) and 27 pattern checks. Results are combined via a weighted geometric mean — a near-zero in any single dimension pulls the overall score down regardless of other dimensions. Every scan is recorded to history (per project); at every 10 multi-run files milestone the calibrator fires — weights apply only when >= 5 improvement events and >= 5 fp_candidate events per class have accumulated.
Full specification: docs/HOW_IT_WORKS.md · docs/MATH_MODELS.md Agent usage: docs/AGENT_WORKFLOW.md
Use the docs by task, not by chronology:
Core behavior
Verification and operations
Calibration and history
Interfaces
- docs/CLI_USAGE.md
- docs/CONFIGURATION.md
- docs/CONFIG_EXAMPLES.md
- docs/CLAUDE_CODE_SKILL.md
- docs/API.md
27 patterns across 5 categories. Full catalog: docs/PATTERNS.md
| Category | Patterns | Signal |
|---|---|---|
| Placeholder | empty_except, not_implemented, pass_placeholder, ellipsis_placeholder, return_none_placeholder, return_constant_stub, todo_comment, fixme_comment, hack_comment, xxx_comment, interface_only_class |
Unfinished / scaffolded code |
| Structural | bare_except, mutable_default_arg, star_import, global_statement |
Anti-patterns |
| Cross-Language | javascript_array_push, java_equals_method, ruby_each, go_print, csharp_length, php_strlen |
Wrong-language syntax |
| Python Advanced | god_function, dead_code, deep_nesting, lint_escape, exact_duplicate_pair, function_clone_cluster, placeholder_variable_naming |
Structural complexity + evasion |
| Phantom | phantom_import |
Hallucinated packages |
Four metric axes per file:
| Metric | What it measures |
|---|---|
| LDR (Logic Density Ratio) | logic_lines / total_lines — code vs. whitespace/comments |
| ICR (Inflation Check) | jargon_density × complexity_modifier — buzzword weight |
| DDC (Dependency Check) | used_imports / total_imports — import utilization |
| Purity | exp(-0.5 × n_critical_patterns) — AND-gate on critical pattern severity |
purity = exp(-0.5 × n_critical_patterns)
quality (GQG) = exp( Σ wᵢ·ln(max(1e-4, dimᵢ)) / Σ wᵢ ) — weighted geometric mean
deficit_score = 100 × (1 − quality) + pattern_penalty
max(1e-4, ...) prevents log(0) = -inf from collapsing the entire score (v3.7.2 __post_init__ guards enforce upstream range invariants on metric results).
| Score | Status |
|---|---|
| ≥ 70 | CRITICAL_DEFICIT |
| ≥ 50 | INFLATED_SIGNAL |
| ≥ 30 | SUSPICIOUS |
| < 30 | CLEAN |
Default weights: ldr=0.40 · inflation=0.30 · ddc=0.20 · purity=0.10 — sum is 1.00; GQG divides by total_w so exact normalization is not required (all four calibrated via --self-calibrate in v3.2.0+)
Project aggregation uses SR9 conservative weighting: 0.6 × min + 0.4 × mean
Full specification: docs/MATH_MODELS.md
Scores are not a black box. Every project and file report renders each metric with its value, healthy direction, and a one-line what it means, plus a deficit-band legend:
Project Metrics
Metric Value Healthy What It Means
Average Deficit Score 6.1/100 Lower Mean file risk; 0 is clean, 100 is severe.
Logic Density Ratio (LDR) 95.36% Higher Share of code lines that contain real implementation.
Inflation-to-Code Ratio (ICR) 0.00x Lower Unjustified jargon vs. average cyclomatic complexity.
Dependency Usage Ratio (DDC) 86.00% Higher Imported libraries referenced by runtime code.
Deficit bands: CLEAN <30 | SUSPICIOUS 30-50 | INFLATED 50-70 | CRITICAL >=70
Each report ends with deterministic Next Steps — the top concern, the
recommended sweep command, and the highest-priority file to open — so analysis
turns directly into action. The same wording is shared by the rich, text, and
markdown renderers.
Every per-file result in the JSON output also carries a deficit_breakdown
that attributes the score back to its source dimensions. This answers
"why is my clean-status file not 0.0?" without drilling into raw findings:
| Field | Meaning |
|---|---|
ldr_penalty |
Points of deficit attributable to low logic density |
inflation_penalty |
Points from buzzword / docstring inflation |
ddc_penalty |
Points from low import-usage ratio |
purity_penalty |
Points from critical-severity pattern hits via GQG |
pattern_hits |
Additive pattern penalty (post-cap) |
total |
Equals deficit_score (sum of the above when not capped at 100) |
GQG-dimension shares are computed via log-loss attribution — the sum of the
five penalty fields equals total within 0.01 when deficit_score < 100.
coherence_level in project-level JSON output reports how the
structural_coherence value was derived:
| Value | Meaning | When emitted |
|---|---|---|
vr_structural |
Vietoris-Rips H0 persistence over file DCFs (MST max edge) | At least two parsed Python files with non-empty DCFs |
vr_structural_approx |
Deterministic approximation of the same signal above the exact topology ceiling | At least two parsed Python files, with file count above advanced.exact_topology_ceiling |
none |
No coherence computed | Empty project, single file, or all files unparseable |
mst_persistence and not_applicable are not emitted — they were
proposed in the v3.7.5 audit but never wired in. Verify the actual value
from the JSON output rather than guessing.
Bootstrap — domain-aware, one command to start
slop-detector --init # auto-detect domain, generate .slopconfig.yaml
slop-detector --init --domain web/api # explicit domain override
slop-detector --init --adaptive-init --init-preview
slop-detector --init --adaptive-init --apply-init-suggestions--init detects your project domain from file patterns (8 built-in profiles:
general, scientific/ml, scientific/numerical, web/api,
library/sdk, cli/tool, bio, finance) and pre-seeds the weight profile
accordingly. Also secures .slopconfig.yaml in .gitignore by default.
Adaptive init is now a separate safety layer:
--init --adaptive-init --init-preview- scans the repository
- prints evidence-backed config suggestions
- writes nothing
--init --adaptive-init --apply-init-suggestions- opt-in merge path
- preserves unknown handwritten keys
- only applies conservative suggestions
JS/TS Analysis — optional tree-sitter path
pip install "ai-slop-detector[js]"
slop-detector --project ./src # now includes .js/.jsx/.ts/.tsx filesActivates JSAnalyzer v2.8.0 with tree-sitter AST (regex fallback when not installed).
Results appear under js_file_results in ProjectAnalysis and JSON output.
Go Analysis — regex-based, optional tree-sitter-go path
pip install "ai-slop-detector[go]"
slop-detector --project ./src # now includes .go filesActivates GoAnalyzer v1.0.0. Detects: empty function stubs, panic() as error handling,
fmt.Println/Printf debug prints, _ = ignored errors, TODO/FIXME comments, god functions
(> 60 lines). Results appear under go_file_results in JSON output.
Self-Calibration — repository-local weight tuning
slop-detector . --self-calibrate # see what your history recommends
slop-detector . --self-calibrate --apply-calibration # write to .slopconfig.yaml4D grid-search (ldr / inflation / ddc / purity) over repository-local run
history. At the milestone, a confident recommendation can update an existing
.slopconfig.yaml; use --self-calibrate to inspect it and
--apply-calibration for an explicit write. This is an operational
calibration layer, not independent external validation or a governance
control by itself.
- Project-scoped —
history.dbtags every record with aproject_id(sha256 of cwd); calibration signal never mixes across different projects - Domain-anchored — grid search is constrained to ±0.15 around the current domain weights, preventing drift outside the domain's meaningful weight region
- Drift warnings —
CalibrationResult.warningsflags any dimension that shifted > 0.25 from the anchor - Only applies when confidence gap between top two candidates exceeds 0.10
- Milestone is triggered by files re-scanned (not raw record count), avoiding false triggers on first-time project scans
docs/SELF_CALIBRATION.md → · Validation boundary →
History Tracking — longitudinal quality analysis
slop-detector mycode.py --show-history # per-file trend
slop-detector --history-trends # 7-day project aggregate
slop-detector --export-history data.jsonlEvery run auto-recorded to ~/.slop-detector/history.db. The history database is
the repository-local signal source for operational calibration and trend review.
docs/HISTORY_TRACKING.md →
cp -r claude-skills/slop-detector ~/.claude/skills/
# restart Claude Code, then use the canonical review surfaces belowAdds a persistent JSON-first review loop inside Claude Code:
review → inspect evidence → apply bounded fixes → pulse/sweep → human handoff.
| Command | What it does |
|---|---|
slop-detector review . --format json |
Changed-code review with verdict, attribution, targets, actions, and findings |
slop-detector pulse . --format json |
Health summary plus hotspot prioritization |
slop-detector sweep <family> . --format json |
Cleanup planning for dead code, duplication, deps, stale suppressions, or boundaries |
slop-detector scan . --format json |
Full baseline analysis when the agent needs the complete core report |
slop-detector verify-governance <artifact> |
Governance artifact verification kept separate from score output |
Recommended use:
- start with
reviewfor PR-like work - use
pulseto decide what to fix next - use
sweeponly for bounded cleanup families - re-run after each patch instead of assuming the first diagnosis still holds
- escalate to a human with evidence, not just a score
AI-SLOP Detector can adjust review sensitivity from history held inside one repository environment. This is a local operational aid: it is not a multi-repository data collection channel, a global profile injector, or evidence that the score is externally validated.
The local calibration path is bounded by project scoping, minimum-history and confidence checks, and the existing configuration boundary. Review the proposed change before relying on it for a team workflow. See docs/SELF_CALIBRATION.md for the supported flow and docs/VALIDATION.md for the validation boundary.
Your .slopconfig.yaml contains domain_overrides — a precise map of which functions
are exempt from complexity rules. This is effectively a codebase weakness surface:
it reveals which areas are too complex to refactor right now.
Best practice:
- Run
slop-detector --initto generate.slopconfig.yamland auto-add it to.gitignore - To share governance config with your team, explicitly remove
.slopconfig.yamlfrom.gitignore - Open-source repos committing it is fine (transparency over obscurity — see this project's own
.slopconfig.yaml)
History is stored at ~/.slop-detector/history.db (your home directory, outside all repos).
It is never committed and accumulates across all projects you scan.
Adversarial Validation (SPAR-Code) — ground-truth regression guard
fhval spar # 3-layer adversarial check
fhval spar --layer a # known-pattern anchors
fhval spar --layer c # existence probesVerifies each metric is measuring what it claims. Catches calibration drift before it reaches production.
Structural Coherence — project-level signal
project = detector.analyze_project("./src")
print(project.structural_coherence) # 0.0 – 1.0Experimental. Use for longitudinal comparison within a project, not as an
absolute gate. Exact MST topology is used up to
advanced.exact_topology_ceiling (default 300 files); above that the engine
switches to a deterministic approximation and reports
coherence_level = "vr_structural_approx". docs/ARCHITECTURE.md →
pre-commit (runs on every commit):
# .pre-commit-config.yaml
repos:
- repo: https://github.com/flamehaven01/AI-SLOP-Detector
rev: v3.7.3
hooks:
- id: slop-detector # hard gate — fails on CRITICAL_DEFICIT >= 70
# - id: slop-detector-warn # soft mode — reports only, never blocks
# - id: slop-detector-patterns # fast per-file pattern scanGitHub Actions (runs on every PR):
# .github/workflows/quality-gate.yml
- name: AI-SLOP Gate
run: |
pip install "ai-slop-detector>=3.7.3"
slop-detector --project . --ci-mode hard --ci-reportEnforcement modes:
--ci-mode soft # informational, never fails build
--ci-mode hard # fails: deficit_score >= 70, critical_patterns >= 3, inflation >= 1.5, ddc < 0.5
--ci-mode quarantine # escalates repeat offenders after 3 violationsFull CI/CD Integration Guide →
# .slopconfig.yaml
weights:
ldr: 0.40
inflation: 0.30
ddc: 0.20
purity: 0.10
patterns:
god_function:
domain_overrides:
- function_pattern: "check_node" # AST walker — complex by design
complexity_threshold: 30
lines_threshold: 200
ignore:
- "tests/**"
- "**/__init__.py"
advanced:
exact_topology_ceiling: 300
topology_mode_above_ceiling: deterministic_approximate
analysis_cache_enabled: true
analysis_cache_db: ""
churn_commit_window: 200
coverage_data_file: ".coverage"
hotspot_limit: 10
hotspot_weights:
deficit: 0.50
churn: 0.30
coverage_gap: 0.20
architecture:
enabled: true
preset: layered
layers: []Full Configuration Guide → · Config Examples →
Use inline suppression when a specific local exception is intentional and should remain visible in audit output:
# slop-disable-next-line bare_except
except:
pass
# slop-disable all
def compatibility_layer():
...
# slop-enable all# slop-disable-next-line <pattern_id|all># slop-disable <pattern_id|all># slop-enable <pattern_id|all>
Suppressed findings are removed from scoring, but they are still recorded in the suppression ledger so reviewers can see which lines were muted.
Repeated Python-file analysis can reuse prior results through the SQLite-backed metadata cache:
advanced:
analysis_cache_enabled: true
analysis_cache_db: "" # empty = default user cache under ~/.slop-detector/- Cache keys include file path, size,
mtime, content hash, engine version, and config fingerprint. - A changed file or changed config invalidates only the affected entries.
- Current scope is Python file analysis reuse; project aggregation still recomputes from the live file set.
Project scans now rank repair order instead of only printing static scores. The hotspot layer combines:
- deficit score
- recent git churn
- coverage gap from
.coverage
When present, the report highlights files that are both sloppy and risky to change because they churn often or remain under-tested. If git metadata or coverage data is missing, the prioritization layer degrades gracefully instead of failing the scan.
The FastAPI server exposes an agent-native contract alongside the existing
human-oriented /analyze/* routes:
GET /agent/schemaPOST /agent/filePOST /agent/project
These routes return structured snapshots with summary metrics, suppression metadata, hotspot ranking, and the raw analysis payload so tools can consume the results without scraping text output.
Real-time inline diagnostics, debounced lint-on-type, ML score and purity signal in status bar. v3.7.1 rebuilt from a single 855-line monolith into eight focused modules.
What you see:
| Surface | Detail |
|---|---|
| Status bar | $(error) SLOP 45.2 — severity icon + deficit score, updates on save |
| Inline diagnostics | Pattern issues with line references — phantom imports, god functions, lint escapes |
| TreeView sidebar | Activity bar panel: files sorted by deficit score, metric rows (LDR/DDC/Purity/Inflation), issue list with click-to-navigate |
| CodeLens | Line 0: file summary (SLOP 45.2 — 3 CRITICAL); per-function: top severity icon + pattern IDs |
| QuickFix (CodeAction) | Lightbulb on phantom_import/god_function/lint_escape diagnostics — show output or add to .slopconfig.yaml ignore |
| ML signal | ML: 73% [slop] in summary diagnostic when [ml] extra is installed |
Commands (Ctrl+Shift+P > "SLOP"):
| Command | Description |
|---|---|
| Analyze Current File | On-demand single-file scan |
| Analyze Workspace | Project-wide scan, populates TreeView |
| Show 4D Breakdown | Webview: penalty attribution — why a file is not 0.0 |
| Show Cleanup Plan | Webview: confidence-ranked sweep family (safe/needs/unsafe) |
| Show Pulse Dashboard | Webview: project health + priority hotspots |
| Show Changed-Code Review | Webview: diff-aware review, new-vs-inherited slop |
| Auto-Fix Detected Issues | Apply (or dry-run preview) auto-fixable patterns |
| Show Gate Decision (SNP) | PASS/HALT with sr9/di2/jsd/ove metrics |
| Run Cross-File Analysis | Dependency + clone graph across project |
| Show File History | Per-file deficit score trend |
| Show History Trends | 7-day project-wide daily trend table |
| Export History to JSONL | Dump history.db records for external analysis |
| Bootstrap .slopconfig.yaml | Domain-aware config generation (--init) |
| Run Self-Calibration | LEDA 4D weight optimizer with one-click Apply |
Install from the VS Code Marketplace or build locally:
cd vscode-extension
npm install
npx vsce package # produces vscode-slop-detector-3.7.3.vsix
code --install-extension vscode-slop-detector-3.7.3.vsixSettings (slopDetector.*): pythonPath, lintOnSave, lintOnType,
failThreshold (default 50), warnThreshold (default 30), recordHistory, enableCodeLens (default true).
| Version | Highlights |
|---|---|
| v3.8.9 | trust-and-measurement release: finding/severity summaries, coverage and ML capability disclosure, explicit --include-tests, root-relative Rust discovery parity checks, strictness-corpus controls, and no aggregate accuracy claim from dogfooding |
| v3.8.8 | packaging metadata cleanup plus VS Code workflow tightening: SPDX string license metadata, real workspace re-scan from Refresh Issues, stale sidebar results cleared on re-analysis, exact-path issue selection, and Quick Fix writes for ignore / phantom_import_allowlist with duplicate protection |
| v3.8.7 | false-positive reduction pack: default .claude/** ignore, runtime-only DDC accounting, quoted vocabulary tables no longer counted as inflation, monorepo + alias-aware phantom import detection, clique+size clone grouping with property-accessor exemption, JS/TS fallback callback-hell no longer confused by JSX/object literals, tiny helper docstrings ignored, and self-dogfood weighted deficit improved from 9.3892 to 6.4186 |
| v3.8.6 | strictness stabilization + coherence cleanup: same-file exact duplicates now surface in cleanup output, four-function clone clusters no longer evade detection, dead-code cleanup requires real dead-code evidence, operations.py is split into payload/cleanup/architecture helpers, and Claude skill/docs now match the canonical scan / review / pulse / sweep surface |
| v3.8.5 | dual-audience output: human summaries hide internal algorithm names while JSON / agent / MCP output gains deterministic next_steps and metric_guide; no breaking JSON key changes |
| v3.8.4 | plain-language documentation entry point: benefit-first README, honest “Why Not Just Use a Linter?” / “When NOT to Use This”, acronym glossary in HOW_IT_WORKS, and plain-meaning config guidance without changing code or contracts |
| v3.8.3 | human-friendly metric output (value / healthy direction / what it means + deficit bands) and deterministic Next Steps across rich/text/markdown; VS Code webview surfaces (4D breakdown, cleanup plan, pulse, diff-aware review); fixes for dead-code semantics, adaptive-init config preservation, and unused-deps stdlib / dev-tool false positives |
| v3.8.2 | adaptive --init adds bounded repo-signal suggestions and preview/merge flows; npm wrapper adds typed contracts, Node API, and agent workflow docs; local impact tracking and opt-in telemetry become first-class observability surfaces |
| v3.8.1 | cleanup-family outputs become confidence-ranked action plans; unused-deps grows manifest hygiene for pyproject.toml / package.json; boundary-violations gains opt-in layered architecture review with explicit rule evidence |
| v3.7.9 | Governance gate: verify-governance fail-closed CLI, deterministic governance-record verification, and a formal split between scoring math and enforcement |
| v3.7.3 | Hotfix: pydantic import wrapped in try/except ImportError — package imports cleanly in stripped environments; test_api_models.py guard corrected to fastapi; CI Docker login continue-on-error, quality gate pinned to >=3.7.3 |
| v3.7.2 | Core schema validation: config.py Pydantic guards catch bad .slopconfig.yaml at load time (wrong weight types, domain_overrides non-int thresholds); LDRResult / DDCResult / InflationResult __post_init__ clamps protect GQG math.log(); HistoryEntry sanitises all LEDA calibration inputs + validates fired_rules JSON; VS Code: schema.ts ISlopReport interfaces + parseSlopReport() handwritten discriminated-union guard — schema mismatch surfaces exact field path before silent NaN |
| v3.7.1 | LintEscapePattern docstring FP fix; self-scan avg_deficit 13.85 → 9.80; global_injector.py Patch 1 removed; .slopconfig.yaml domain_overrides expanded; Skill: 3-Phase Pipeline (Triage → Deep-Dive → Action Plan), /slop-delta before/after comparison, Confidence Routing by status band, → Next: guidance per command; VS Code: P1 monolith → 8 focused modules, P2 SlopCodeActionProvider (QuickFix for phantom_import/god_function/lint_escape), P3 TreeView sidebar (3-level hierarchy), P4 SlopCodeLensProvider (file summary + per-function hints) |
| v3.7.0 | Dogfooding calibration + SKILL.md OSOT repair (10 violations); cli_renderer.py split (730 lines → 4 renderer modules); python_advanced.py split (1150 lines → 5 modules); BUG-1 ddc weight 0.30→0.20; BUG-2 findings filter threshold fix; BUG-3 AST-accurate test counts; BUG-5 block-scoped YAML rewrite in self_calibrator; 314 tests GREEN |
| v3.6.0 | Claude Code Skill (/slop, /slop-file, /slop-gate, /slop-spar); CI gate bugfix (--ci-mode hard now exits non-zero without --ci-report); pre-commit hooks rewritten (python -m entry, 3 hook variants); VS Code Extension v3.6.0 VSIX; docs: Purity row, weight normalization note, [go] extra; 311 tests GREEN |
| v3.5.0 | Domain-aware --init (8 profiles, --domain flag); JS/TS analysis via JSAnalyzer v2.8.0 + [js]; Go analysis via GoAnalyzer v1.0.0 + [go]; self-calibration patches: project-scoped history (project_id), re-scan milestone trigger, domain-anchored grid search (±0.15), CalibrationResult.warnings (drift > 0.25); 308 tests GREEN |
| v3.4.1 | FileRole.STUB (Protocol/ABC stubs skip ldr+patterns); auto-discover .slopconfig.yaml; Python 3.8 CI compat; mypy attr-defined fix |
| v3.4.0 | Per-rule FP rate tracking (LEDA Phase 2A); purity weight ceiling MAX_PURITY_WEIGHT=0.25 (Phase 2B) |
| v3.3.0 | File role classifier (SOURCE/INIT/RE_EXPORT/TEST/MODEL/CORPUS); DDC annotation-only import fix; # noqa: F401 + __all__ re-export recognition |
| v3.2.1 | Auto-calibration at every 10-scan milestone (no manual cmd); P2 git noise filter; P3 per-class thresholds (5+5); calibrate() min_events bugfix; 11/11 e2e GREEN |
| v3.2.0 | 4D calibration (purity dimension); --init bootstrap; auto-calibration hints; 44/44 self-scan CLEAN |
| v3.1.2 | data_collector refactor; slopconfig gap fill; 43/43 self-scan CLEAN |
| v3.1.1 | Clone Detection in Core Metrics table; table style unification; VS Code UX |
| v3.1.0 | 3 new adversarial patterns (function_clone_cluster, placeholder_variable_naming, return_constant_stub); GQG calibrator alignment; fhval SPAR-Code |
| v3.0.2 | Phantom import 3-tier classification; __init__.py LDR fix; god_function LOW demotion |
| v3.0.0 | Geometric mean scorer (GQG); purity dimension; DCF per-file; structural coherence |
| v2.9.3 | Self-calibration engine; weight grid-search from usage history |
| v2.9.0 | phantom_import CRITICAL detection; history auto-tracking |
Full Release Notes → · Changelog →
git clone https://github.com/flamehaven01/AI-SLOP-Detector.git
cd AI-SLOP-Detector
pip install -e ".[dev]"
pytest tests/ -v --cov
black src/ tests/
ruff check src/ tests/Chart updated weekly via GitHub Actions. Monthly installs: pypistats.org (mirrors excluded). Total: pepy.tech (incl. mirrors)
MIT — see LICENSE.
Flamehaven Labs • Issues • Discussions • Docs

