Dotnet-slopwatch – detect when AI coding agents "fix" problems by cheating
Slopwatch is a .NET tool that detects cheating behaviors by AI coding assistants, such as disabling tests, suppressing warnings, empty catch blocks, and adding arbitrary delays. It can run as a Claude Code hook or in CI/CD pipelines to ensure code quality.
Notifications You must be signed in to change notification settings
Fork 2
Star 88
BranchesTags
Open more actions menu
Folders and files
NameName
Last commit message
Last commit date
Latest commit
History
63 Commits
63 Commits
.azure
.azure
.claude-plugin
.claude-plugin
.claude
.claude
.config
.config
.github
.github
.slopwatch
.slopwatch
docs
docs
images
images
scripts
scripts
src
src
tests
tests
.gitattributes
.gitattributes
.gitignore
.gitignore
CLAUDE.md
CLAUDE.md
Directory.Build.props
Directory.Build.props
Directory.Packages.props
Directory.Packages.props
LICENSE
LICENSE
NuGet.Config
NuGet.Config
README.md
README.md
RELEASE_NOTES.md
RELEASE_NOTES.md
Slopwatch.slnx
Slopwatch.slnx
build.ps1
build.ps1
coverlet.runsettings
coverlet.runsettings
global.json
global.json
Repository files navigation
// LLM anti-cheat
A .NET tool that detects LLM "reward hacking" behaviors in code changes.
Runs as a Claude Code hook or in CI/CD pipelines to catch when AI coding assistants take shortcuts instead of properly fixing issues.
What is "Slop"?
When LLMs generate code, they sometimes take shortcuts that make tests pass or builds succeed without actually solving the underlying problem. These patterns include:
Disabling tests instead of fixing them ([Fact(Skip="flaky")])
Suppressing warnings instead of addressing them (#pragma warning disable)
Swallowing exceptions with empty catch blocks
Adding arbitrary delays to mask timing issues (Task.Delay(1000))
Project-level warning suppression (, false)
Bypassing Central Package Management with VersionOverride or inline Version attributes
And more...
Slopwatch catches these patterns before they make it into your codebase.
Installation
Install as a global tool
dotnet tool install --global Slopwatch.Cmd
Or install locally
dotnet new tool-manifest dotnet tool install --local Slopwatch.Cmd
Quick Start
1. Install slopwatch
dotnet tool install --global Slopwatch.Cmd
2. Initialize in your project (creates baseline from existing code)
cd your-project slopwatch init
3. Commit the baseline to your repository
git add .slopwatch/baseline.json git commit -m "Add slopwatch baseline"
4. From now on, only NEW slop is detected
slopwatch analyze
The baseline approach ensures slopwatch catches new slop being introduced without flagging legacy code. Your CI/CD pipeline will fail if someone introduces new slop patterns.
Usage
Initialize a Project
Create baseline from existing code
slopwatch init
Force overwrite existing baseline
slopwatch init --force
This creates .slopwatch/baseline.json containing all existing detections. Commit this file to your repository.
Analyze for New Issues
Analyze current directory (requires baseline by default)
slopwatch analyze
Analyze specific directory
slopwatch analyze -d src/
Skip baseline and report ALL issues (not recommended for CI)
slopwatch analyze --no-baseline
Update Baseline
When you intentionally add code that triggers slopwatch (with proper justification):
Add new detections to existing baseline
slopwatch analyze --update-baseline
Output Formats
Human-readable console output (default)
slopwatch analyze
JSON for programmatic use
slopwatch analyze --output json
Exit Codes
Fail if errors found (default)
slopwatch analyze --fail-on error
Fail on warnings too
slopwatch analyze --fail-on warning
Performance
If you're concerned about performance on large projects, use --stats to see how many files are being analyzed and how long it takes:
slopwatch analyze --stats
Output: Stats: 44 files analyzed in 1.64s
Detection Rules
Rule Severity Description
SW001 Error Disabled tests via Skip, Ignore, or #if false
SW002 Warning Warning suppression via pragma or SuppressMessage
SW003 Error Empty catch blocks that swallow exceptions
SW004 Warning Arbitrary delays in test code (Task.Delay, Thread.Sleep)
SW005 Warning Project file slop (NoWarn, TreatWarningsAsErrors=false)
SW006 Error CPM bypass via VersionOverride or inline Version attributes
Claude Code Integration
Add slopwatch as a hook to catch slop patterns during AI-assisted coding. Add the following to your project's .claude/settings.json:
{ "hooks": { "PostToolUse": [ { "matcher": "Write|Edit|MultiEdit", "hooks": [ { "type": "command", "command": "slopwatch analyze -d . --hook", "timeout": 60000 } ] } ] } }
The --hook flag enables Claude Code integration mode which:
Uses git status to only analyze dirty files - makes hooks near-instant even on large repos
Outputs errors to stderr in a readable format
Suppresses all other output
Blocks on warnings and errors
Exits with code 2 on failure (blocking the edit)
Claude will see the formatted error message and can then fix the issue properly.
Note: Hook mode requires git. If git is unavailable, it falls back to full analysis.
CI/CD Integration
GitHub Actions
- name: Install Slopwatch
run: dotnet tool install --global Slopwatch.Cmd
- name: Run Slopwatch
run: slopwatch analyze -d . --output json --fail-on error
Note: The baseline file (.slopwatch/baseline.json) should be committed to your repository. Run slopwatch init locally first.
Azure DevOps
- task: DotNetCoreCLI@2
displayName: 'Install Slopwatch' inputs: command: 'custom' custom: 'tool' arguments: 'install --global Slopwatch.Cmd'
- script: slopwatch analyze -d . --fail-on error
displayName: 'Run Slopwatch'
Configuration
Create a .slopwatch/config.json file to define suppressions:
{ "suppressions": [ { "ruleId": "SW002", "pattern": "/Generated/", "justification": "Generated code from tooling cannot be manually changed" }, { "ruleId": "SW006", "pattern": "src/Legacy/**", "justification": "Legacy CPM migration in progress; tracked in issue #123" } ], "globalSuppressions": [] }
Use the -c or --config option to specify a custom suppression config file location:
slopwatch analyze -d . --config path/to/config.json
To exclude files or directories from analysis entirely, use --exclude:
slopwatch analyze -d . --exclude "/Generated/,/obj/,/bin/"
Building from Source
dotnet build dotnet test dotnet pack
Contributing
Fork and create a feature branch
Make changes and add tests
Submit a pull request
Note: This project uses slopwatch on itself - your PR will be analyzed for slop patterns!
License
Apache 2.0 - see LICENSE for details.
Inspiration
Slopometry - Python equivalent for Claude Code
Incrementalist - Git diff analysis patterns
About
Catch naughty LLM reward-hacking and bad behavior for .NET coding
Resources
Readme
License
Apache-2.0 license
Code of conduct
Code of conduct
Contributing
Contributing
Uh oh!
There was an error while loading. Please reload this page.
Activity
Stars
88 stars
Watchers
0 watching
Forks
2 forks
Report repository
Releases 11
Slopwatch 0.4.1
Latest
May 28, 2026
+ 10 releases
Packages 0
Uh oh!
There was an error while loading. Please reload this page.
Contributors
Uh oh!
There was an error while loading. Please reload this page.
Languages
C# 99.3%
PowerShell 0.7%
Generated from akkadotnet/build-system-template