Agent skill

Dotnet Slopwatch

by Aaronontheweb in Aaronontheweb/dotnet-skills

Use Slopwatch to detect LLM reward hacking in .NET code changes.

MITAuto-check passedDevOps & Cloud

Install Dotnet Slopwatch

skills CLI
$ npx skills add Aaronontheweb/dotnet-skills --skill dotnet-slopwatch -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install Aaronontheweb/dotnet-skills dotnet-slopwatch --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/Aaronontheweb/dotnet-skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/slopwatch .claude/skills/dotnet-slopwatch && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
dotnet-slopwatch
GitHub stars
1.2k
Used in
1 other repo
Token cost
~2.1k tokens
SKILL.md length
636 words
Files
1
Skills in repo
33
Repo updated
First seen
Licence
MIT

At a glance

Use Slopwatch to detect LLM reward hacking in .NET code changes.

  • Works in 3 steps: Understand why the LLM took the shortcut → Request a proper fix - be specific about… → Verify the fix doesn't introduce…
  • DevOps & Cloud work in your project
  • SKILL.md covers When to Use This Skill, What is Slop?, Installation and First-Time Setup: Establish a…, plus 8 more sections
  • Calls git and dotnet

What it does

Dotnet Slopwatch is an agent skill from Aaronontheweb/dotnet-skills. Use Slopwatch to detect LLM reward hacking in .NET code changes. Run after every code modification to catch disabled tests, suppressed warnings, empty catch blocks, and other shortcuts that mask real problems.

Its SKILL.md is about 2.1k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in DevOps & Cloud. It works with .NET. The repository describes itself as: Claude Code skills and sub-agents for .NET Developers. The licence is MIT.

When your agent uses it

  • DevOps & Cloud work in your project

Example prompts

  • “/dotnet-slopwatch”

Workflow steps

3 steps, taken from the first numbered list in SKILL.md.

  1. Understand why the LLM took the shortcut
  2. Request a proper fix - be specific about what's wrong
  3. Verify the fix doesn't introduce different slop

What it can do on your machine

Read from SKILL.md and the folder at commit e426ed9. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • git
    • dotnet

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md. Its commands use git, which can reach the network depending on how they are called.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Dotnet Slopwatch loads about 2.1k tokens when it runs. Until then it costs about 57 tokens; SKILL.md has 636 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~57
When it runs · the whole SKILL.md, loaded when a task matches
~2.1k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from Aaronontheweb/dotnet-skills at commit e426ed9, republished under its MIT licence (© Aaronontheweb). 636 words, ~2,117 tokens.

Download SKILL.mdSave it as .claude/skills/dotnet-slopwatch/SKILL.md (or your agent's skills folder).
name
dotnet-slopwatch
description
Use Slopwatch to detect LLM reward hacking in .NET code changes. Run after every code modification to catch disabled tests, suppressed warnings, empty catch blocks, and other shortcuts that mask real problems.
invocable
true

Slopwatch: LLM Anti-Cheat for .NET

When to Use This Skill

Use this skill constantly. Every time an LLM (including Claude) makes changes to:

  • C# source files (.cs)
  • Project files (.csproj)
  • Props files (Directory.Build.props, Directory.Packages.props)
  • Test files

Run slopwatch to validate the changes don't introduce "slop."

What is Slop?

"Slop" refers to shortcuts LLMs take that make tests pass or builds succeed without actually solving the underlying problem. These are reward hacking behaviors - the LLM optimizes for apparent success rather than real fixes.

Common Slop Patterns
PatternExampleWhy It's Bad
Disabled tests[Fact(Skip="flaky")]Hides failures instead of fixing them
Warning suppression#pragma warning disable CS8618Silences compiler without fixing issue
Empty catch blockscatch (Exception) { }Swallows errors, hides bugs
Arbitrary delaysawait Task.Delay(1000);Masks race conditions, makes tests slow
Project-level suppression<NoWarn>CS1591</NoWarn>Disables warnings project-wide
CPM bypassVersion="1.0.0" inlineUndermines central package management

Never accept these patterns. If an LLM introduces slop, reject the change and require a proper fix.


Installation

Add to .config/dotnet-tools.json:

json
{
  "version": 1,
  "isRoot": true,
  "tools": {
    "slopwatch.cmd": {
      "version": "0.2.0",
      "commands": ["slopwatch"],
      "rollForward": false
    }
  }
}

Then restore:

bash
dotnet tool restore
As a Global Tool
bash
dotnet tool install --global Slopwatch.Cmd

First-Time Setup: Establish a Baseline

Before using slopwatch on an existing project, create a baseline of current issues:

bash
# Initialize baseline from existing code
slopwatch init

# This creates .slopwatch/baseline.json
git add .slopwatch/baseline.json
git commit -m "Add slopwatch baseline"

Why baseline? Legacy code may have existing issues. The baseline ensures slopwatch only catches new slop being introduced, not pre-existing technical debt.


Usage During LLM Sessions

After Every Code Change

Run slopwatch after any LLM-generated code modification:

bash
# Analyze for new issues (uses baseline)
slopwatch analyze

# Use strict mode - fail on warnings too
slopwatch analyze --fail-on warning
When Slopwatch Flags an Issue

Do not ignore it. Instead:

  1. Understand why the LLM took the shortcut
  2. Request a proper fix - be specific about what's wrong
  3. Verify the fix doesn't introduce different slop
# Example: LLM disabled a test
❌ SW001 [Error]: Disabled test detected
   File: tests/MyApp.Tests/OrderTests.cs:45
   Pattern: [Fact(Skip="Test is flaky")]

# Correct response: Ask for actual fix
"This test was disabled instead of fixed. Please investigate why
it's flaky and fix the underlying timing/race condition issue."
Updating the Baseline (Rare)

Only update the baseline when slop is truly justified and documented:

bash
# Add current detections to baseline (use sparingly!)
slopwatch analyze --update-baseline

Justification examples:

  • Third-party library forces a pattern (e.g., must suppress specific warning)
  • Intentional delay for rate limiting (not test flakiness)
  • Generated code that can't be modified

Document why in a code comment when updating baseline.


Claude Code Hook Integration

Add slopwatch as a hook to automatically validate every edit. Create or update .claude/settings.json:

json
{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Write|Edit|MultiEdit",
        "hooks": [
          {
            "type": "command",
            "command": "slopwatch analyze -d . --hook",
            "timeout": 60000
          }
        ]
      }
    ]
  }
}

The --hook flag:

  • Only analyzes git dirty files (fast, even on large repos)
  • Outputs errors to stderr in readable format
  • Blocks the edit on warnings/errors (exit code 2)
  • Claude sees the error and can fix it immediately

CI/CD Integration

Add slopwatch to your CI pipeline as a quality gate:

Show full SKILL.md (253 more words)Show less
GitHub Actions
yaml
jobs:
  slopwatch:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Setup .NET
        uses: actions/setup-dotnet@v4
        with:
          dotnet-version: '9.0.x'

      - name: Install Slopwatch
        run: dotnet tool install --global Slopwatch.Cmd

      - name: Run Slopwatch
        run: slopwatch analyze -d . --fail-on warning
Azure Pipelines
yaml
- task: DotNetCoreCLI@2
  displayName: 'Install Slopwatch'
  inputs:
    command: 'custom'
    custom: 'tool'
    arguments: 'install --global Slopwatch.Cmd'

- script: slopwatch analyze -d . --fail-on warning
  displayName: 'Slopwatch Analysis'

Detection Rules

RuleSeverityWhat It Catches
SW001ErrorDisabled tests (Skip=, Ignore, #if false)
SW002WarningWarning suppression (#pragma warning disable, SuppressMessage)
SW003ErrorEmpty catch blocks that swallow exceptions
SW004WarningArbitrary delays in tests (Task.Delay, Thread.Sleep)
SW005WarningProject file slop (NoWarn, TreatWarningsAsErrors=false)
SW006WarningCPM bypass (VersionOverride, inline Version attributes)

Configuration

Create .slopwatch/slopwatch.json to customize:

json
{
  "minSeverity": "warning",
  "rules": {
    "SW001": { "enabled": true, "severity": "error" },
    "SW002": { "enabled": true, "severity": "warning" },
    "SW003": { "enabled": true, "severity": "error" },
    "SW004": { "enabled": true, "severity": "warning" },
    "SW005": { "enabled": true, "severity": "warning" },
    "SW006": { "enabled": true, "severity": "warning" }
  },
  "exclude": [
    "**/Generated/**",
    "**/obj/**",
    "**/bin/**"
  ]
}

For maximum protection during LLM coding sessions, elevate all rules to errors:

json
{
  "minSeverity": "warning",
  "rules": {
    "SW001": { "enabled": true, "severity": "error" },
    "SW002": { "enabled": true, "severity": "error" },
    "SW003": { "enabled": true, "severity": "error" },
    "SW004": { "enabled": true, "severity": "error" },
    "SW005": { "enabled": true, "severity": "error" },
    "SW006": { "enabled": true, "severity": "error" }
  }
}

The Philosophy: Zero Tolerance for New Slop

  1. Baseline captures legacy - Existing issues are acknowledged but isolated
  2. New slop is blocked - Any new shortcut fails the build/edit
  3. Exceptions require justification - If you must update baseline, document why
  4. LLMs are not special - The same rules apply to human and AI-generated code

The goal is to prevent the gradual accumulation of technical debt that occurs when LLMs optimize for "make the test pass" rather than "fix the actual problem."


Quick Reference

bash
# First time setup
slopwatch init
git add .slopwatch/baseline.json

# After every LLM code change
slopwatch analyze

# Strict mode (recommended)
slopwatch analyze --fail-on warning

# With stats (performance debugging)
slopwatch analyze --stats

# Update baseline (rare, document why)
slopwatch analyze --update-baseline

# JSON output for tooling
slopwatch analyze --output json

When to Override (Almost Never)

The only valid reasons to update baseline or disable a rule:

ScenarioActionRequired
Third-party forces patternUpdate baselineCode comment explaining why
Generated code (not editable)Add to exclude listDocument in config
Intentional rate limiting delayUpdate baselineCode comment, not in test
Legacy code cleanupOne-time baseline updatePR description

Invalid reasons:

  • "The test is flaky" → Fix the flakiness
  • "The warning is annoying" → Fix the code
  • "It works on my machine" → Fix the race condition
  • "We'll fix it later" → Fix it now

© Aaronontheweb, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in skills/slopwatch of Aaronontheweb/dotnet-skills.

Open the folder on GitHubat commit e426ed9

Used in 1 other repository

We found 1 copy of this SKILL.md (exact, near-identical or edited) in other folders, from 1 other GitHub owner. This page covers the copy in Aaronontheweb/dotnet-skills, which our catalogue first saw on October 7, 2026.

Compare with similar skills

Dotnet Slopwatch next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Dotnet Slopwatch compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Dotnet Slopwatch this skillAaronontheweb/dotnet-skills1.2k1 repos~2.1kAutomated safety check: PassMIT
Aspiremicrosoft/aspire.dev1964 repos~1.1kAutomated safety check: PassMIT
.NET Crash Dump Collectiondotnet/skills5.6k2 repos~1.1kAutomated safety check: PassMIT
Pyroscopegrafana/skills281—~1.2kAutomated safety check: PassApache-2.0
Dotnet Upgradegithub/awesome-copilot40k1 repos~1.8kAutomated safety check: PassMIT
Dockerfile And Readme Templatingdotnet/dotnet-docker4.9k—~563Automated safety check: PassMIT

Similar skills

  • Aspire

    microsoft/aspire.dev

    Official

    Orchestrates Aspire distributed applications using the Aspire CLI for running, debugging, and managing distributed apps.

    196 GitHub starsUsed in 4 repos~1.1k tokens
    DevOps & CloudAuto-check passed
  • Official

    Configures automatic crash dumps or captures dumps from running processes for modern .NET apps on Linux, macOS and Windows, including Docker and Kubernetes.

    5.6k GitHub starsUsed in 2 repos~1.1k tokens
    DevOps & CloudAuto-check passed
  • Pyroscope

    grafana/skills

    Official

    Continuously profile applications with Grafana Pyroscope and read the result as flame graphs.

    281 GitHub stars~1.2k tokensUpdated yesterday
    DevOps & CloudAuto-check passed
  • Dotnet Upgrade

    github/awesome-copilot

    Official

    Ready-to-use prompts for comprehensive .NET framework upgrade analysis and execution

    40k GitHub starsUsed in 1 repo~1.8k tokens
    DevOps & CloudAuto-check passed
  • Official

    Modify Cottle templates that generate Dockerfiles and READMEs in dotnet/dotnet-docker.

    4.9k GitHub stars~563 tokensUpdated yesterday
    DevOps & CloudAuto-check passed
  • Porting Changes

    dotnet/dotnet-docker

    Official

    Plan and move changes between branches in dotnet/dotnet-docker.

    4.9k GitHub stars~781 tokensUpdated yesterday
    DevOps & CloudAuto-check passed

More from Aaronontheweb/dotnet-skills

All 33 skills in this repo
  • Akka.Hosting Actor Patterns

    Aaronontheweb/dotnet-skills

    Shows how to build entity actors with Akka.Hosting so the same code runs in local unit tests and in a sharded cluster in production.

    1.2k GitHub starsUsed in 1 repo~5k tokens
    Auto-check passed
  • .NET Trimming and Native AOT

    Aaronontheweb/dotnet-skills

    Guides making .NET libraries trimming-safe and Native-AOT compatible: the MSBuild properties, trimming attributes, warning codes and a playbook of safe patterns.

    1.2k GitHub stars~2.9k tokensUpdated 22 days ago
    Auto-check passed
  • Akka.NET Best Practices

    Aaronontheweb/dotnet-skills

    Guidance for Akka.NET actor systems covering EventStream versus DistributedPubSub, supervision, Props versus DependencyResolver, work distribution and testable cluster code.

    1.2k GitHub starsUsed in 1 repo~3.3k tokens
    Auto-check passed
  • Akka.NET Management and Discovery

    Aaronontheweb/dotnet-skills

    Sets up Akka.Management and Cluster.Bootstrap so Akka.NET clusters form through service discovery on Kubernetes, Azure or config instead of static seed nodes.

    1.2k GitHub starsUsed in 1 repo~2.5k tokens
    Auto-check passed
  • Akka.NET Testing Patterns

    Aaronontheweb/dotnet-skills

    Shows how to test Akka.NET actors with Akka.Hosting.TestKit: swapping services for fakes, using TestProbes, and checking persistence, plus when the older TestKit still fits.

    1.2k GitHub starsUsed in 1 repo~2.4k tokens
    Auto-check passed
  • .NET API Compatibility Design

    Aaronontheweb/dotnet-skills

    Applies extend-only design rules to NuGet packages and distributed systems, covering source, binary and wire compatibility and how to deprecate members safely.

    1.2k GitHub starsUsed in 1 repo~2.7k tokens
    Auto-check passed

Works with

Questions about Dotnet Slopwatch

What does Dotnet Slopwatch do?

Use Slopwatch to detect LLM reward hacking in .NET code changes. Dotnet Slopwatch is an agent skill from Aaronontheweb/dotnet-skills.NET code changes.

When should I use Dotnet Slopwatch?

Dotnet Slopwatch fits situations like: devOps & Cloud work in your project.

How do I install Dotnet Slopwatch in Claude Code?

Run `npx skills add Aaronontheweb/dotnet-skills --skill dotnet-slopwatch -a claude-code`. Or copy the skill folder (skills/slopwatch in Aaronontheweb/dotnet-skills) into .claude/skills/dotnet-slopwatch in your project. Claude Code loads it when a task matches its description.

How do I install Dotnet Slopwatch in Codex?

Run `npx skills add Aaronontheweb/dotnet-skills --skill dotnet-slopwatch -a codex`. Or copy the skill folder (skills/slopwatch in Aaronontheweb/dotnet-skills) into .agents/skills/dotnet-slopwatch in your project. Codex loads it when a task matches its description.

Can I use Dotnet Slopwatch in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add Aaronontheweb/dotnet-skills --skill dotnet-slopwatch -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/dotnet-slopwatch, .gemini/skills/dotnet-slopwatch, .github/skills/dotnet-slopwatch and .opencode/skills/dotnet-slopwatch in your project.

What does Dotnet Slopwatch need to run?

Going by SKILL.md and its folder, Dotnet Slopwatch needs the command-line tools its instructions call (git and dotnet).

Does Dotnet Slopwatch access the network?

SKILL.md contains no URLs. Its commands use git, which can reach the network depending on how they are called. This is read from the text; nothing was executed.

Is Dotnet Slopwatch safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Dotnet Slopwatch use?

Dotnet Slopwatch is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Dotnet Slopwatch use?

About 2.1k tokens (SKILL.md is roughly 8.5k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Dotnet Slopwatch?

Skills that share tags, products or a category with Dotnet Slopwatch: Aspire (microsoft/aspire.dev, 196 stars), .NET Crash Dump Collection (dotnet/skills, 5.6k stars), Pyroscope (grafana/skills, 281 stars) and Dotnet Upgrade (github/awesome-copilot, 40k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Dotnet Slopwatch?

Aaronontheweb (a GitHub user) maintains it in Aaronontheweb/dotnet-skills, which has 1,205 GitHub stars. The repository holds 33 skills in this directory. The repository was last updated on September 17, 2026.

Source: Aaronontheweb/dotnet-skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.