AI News HubLIVE
站内改写3 min read

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.

SourceHacker News AIAuthor: bastijn

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