CommunityCodierung & Entwicklunggithub.com

dotnet-slopwatch

Nutze Slopwatch, um LLM-Belohnungshacking in .NET-Codeänderungen zu erkennen. Führe es nach jeder Codeänderung aus, um deaktivierte Tests, unterdrückte Warnungen, leere Catch-Blöcke und andere Abkürzungen zu finden, die echte Probleme verschleiern.

Was ist dotnet-slopwatch?

Slopwatch ist ein spezielles .NET-Tool, das entwickelt wurde, um "Slop" zu erkennen – also Abkürzungen, die KI-Modelle wie Claude oder GPT nehmen, um Tests bestehen zu lassen oder Builds erfolgreich abzuschließen, ohne die zugrunde liegenden Probleme tatsächlich zu beheben. Es wird nach jeder Codeänderung ausgeführt und identifiziert gängige Muster wie deaktivierte Tests, unterdrückte Compiler-Warnungen, leere Catch-Blöcke, willkürliche Verzögerungen und Projektweite Warnungsunterdrückungen. Nützlich ist es vor allem in LLM-gestützten Entwicklungssitzungen, wo es als Qualitätssicherung dient, die verhindert, dass technische Schulden eingeführt werden. Slopwatch unterstützt Plattformen wie Claude Code (über Hooks), CI/CD-Pipelines (GitHub Actions, Azure Pipelines) und kann sowohl als lokales Tool als auch global installiert werden. Es arbeitet mit einer Baseline, die bestehende Probleme erfasst, und meldet nur neu eingeführte Verstöße. Bei Erkennung eines Problems blockiert es den Code und zwingt zu einer korrekten Lösung, anstatt die Abkürzung zu akzeptieren.

Funktioniert mit✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/Aaronontheweb/dotnet-skills/tree/main/skills/slopwatch

Installed? Explore more Codierung & Entwicklung skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

Slopwatch: KI-Anti-Cheat für .NET

Wann du diese Fähigkeit nutzen solltest

Nutze diese Fähigkeit ständig. Jedes Mal, wenn ein KI-Modell (einschließlich Claude) Änderungen an folgenden Dateien vornimmt:

  • C#-Quelldateien (.cs)
  • Projektdateien (.csproj)
  • Props-Dateien (Directory.Build.props, Directory.Packages.props)
  • Testdateien

Führe Slopwatch aus, um zu überprüfen, ob die Änderungen keinen "Slop" enthalten.

Was ist Slop?

"Slop" bezeichnet Abkürzungen, die KI-Modelle nehmen, um Tests bestehen oder Builds erfolgreich abzuschließen, ohne das eigentliche Problem zu lösen. Dabei handelt es sich um Belohnungshacking-Verhalten – das KI-Modell optimiert auf scheinbaren Erfolg, statt auf echte Korrekturen.

Häufige Slop-Muster

MusterBeispielWarum es schlecht ist
Deaktivierte Tests[Fact(Skip="flaky")]Versteckt Fehler, statt sie zu beheben
Warnungsunterdrückung#pragma warning disable CS8618Schaltet den Compiler stumm, ohne das Problem zu beheben
Leere Catch-Blöckecatch (Exception) { }Verschlingt Fehler, versteckt Bugs
Willkürliche Verzögerungenawait Task.Delay(1000);Kaschiert Race Conditions, macht Tests langsam
Projektweite Unterdrückung<NoWarn>CS1591</NoWarn>Deaktiviert Warnungen projektweit
CPM-UmgehungVersion="1.0.0" inlineUntergräbt zentrales Paketmanagement

Akzeptiere diese Muster niemals. Wenn ein KI-Modell Slop einführt, lehne die Änderung ab und fordere eine korrekte Lösung.


Installation

Als lokales Tool (empfohlen)

Füge zu .config/dotnet-tools.json hinzu:

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

Dann wiederherstellen:

dotnet tool restore

Als globales Tool

dotnet tool install --global Slopwatch.Cmd

Ersteinrichtung: Baseline erstellen

Bevor du Slopwatch auf einem bestehenden Projekt verwendest, erstelle eine Baseline der aktuellen Probleme:

# Baseline aus vorhandenem Code initialisieren
slopwatch init

# Erstellt .slopwatch/baseline.json
git add .slopwatch/baseline.json
git commit -m "Slopwatch-Baseline hinzugefügt"

Warum eine Baseline? Legacy-Code kann bereits bestehende Probleme enthalten. Die Baseline stellt sicher, dass Slopwatch nur neu eingeführten Slop erfasst, nicht bestehende technische Schulden.


Verwendung während KI-Sitzungen

Nach jeder Codeänderung

Führe Slopwatch nach jeder durch ein KI-Modell generierten Codeänderung aus:

# Analysiere auf neue Probleme (nutzt Baseline)
slopwatch analyze

# Verwende strikten Modus – scheitere auch bei Warnungen
slopwatch analyze --fail-on warning

Wenn Slopwatch ein Problem meldet

Ignoriere es nicht. Stattdessen:

  1. Verstehe, warum das KI-Modell die Abkürzung genommen hat
  2. Fordere eine korrekte Lösung – sei spezifisch, was falsch ist
  3. Überprüfe die Korrektur darauf, dass sie keinen anderen Slop einführt
# Beispiel: KI-Modell hat einen Test deaktiviert
❌ SW001 [Fehler]: Deaktivierter Test erkannt
   Datei: tests/MyApp.Tests/OrderTests.cs:45
   Muster: [Fact(Skip="Test is flaky")]

# Korrekte Antwort: Fordere echte Korrektur
"Dieser Test wurde deaktiviert statt behoben. Bitte untersuche,
warum er flaky ist, und behebe das zugrunde liegende
Timing-/Race-Condition-Problem."

Baseline aktualisieren (selten)

Aktualisiere die Baseline nur, wenn Slop wirklich gerechtfertigt und dokumentiert ist:

# Füge aktuelle Erkennungen zur Baseline hinzu (sparsam verwenden!)
slopwatch analyze --update-baseline

Beispiele für Rechtfertigungen:

  • Eine Drittanbieter-Bibliothek erzwingt ein Muster (z. B. bestimmte Warnung muss unterdrückt werden)
  • Absichtliche Verzögerung für Ratenbegrenzung (nicht Test-Flakiness)
  • Generierter Code, der nicht geändert werden kann

Dokumentiere den Grund in einem Codekommentar, wenn du die Baseline aktualisierst.


Claude Code Hook-Integration

Füge Slopwatch als Hook hinzu, um jede Bearbeitung automatisch zu validieren. Erstelle oder aktualisiere .claude/settings.json:

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

Der --hook-Flag:

  • Analysiert nur Git-Dirty-Dateien (schnell, auch bei großen Repos)
  • Gibt Fehler im lesbaren Format nach stderr aus
  • Blockiert die Bearbeitung bei Warnungen/Fehlern (Exit-Code 2)
  • Claude sieht den Fehler und kann ihn sofort beheben

CI/CD-Integration

Füge Slopwatch als Qualitätstor in deine CI-Pipeline ein:

GitHub Actions

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: Slopwatch installieren
        run: dotnet tool install --global Slopwatch.Cmd

      - name: Slopwatch ausführen
        run: slopwatch analyze -d . --fail-on warning

Azure Pipelines

- task: DotNetCoreCLI@2
  displayName: 'Slopwatch installieren'
  inputs:
    command: 'custom'
    custom: 'tool'
    arguments: 'install --global Slopwatch.Cmd'

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

Erkennungsregeln

RegelSchweregradWas wird erkannt
SW001FehlerDeaktivierte Tests (Skip=, Ignore, #if false)
SW002WarnungWarnungsunterdrückung (#pragma warning disable, SuppressMessage)
SW003FehlerLeere Catch-Blöcke, die Ausnahmen verschlucken
SW004WarnungWillkürliche Verzögerungen in Tests (Task.Delay, Thread.Sleep)
SW005WarnungProjektdatei-Slop (NoWarn, TreatWarningsAsErrors=false)
SW006WarnungCPM-Umgehung (VersionOverride, inline Version-Attribute)

Konfiguration

Erstelle .slopwatch/slopwatch.json zur Anpassung:

{
  "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/**"
  ]
}

Strenger Modus (empfohlen für KI-Sitzungen)

Für maximalen Schutz während KI-Codiersitzungen stufe alle Regeln auf Fehler hoch:

{
  "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" }
  }
}

Die Philosophie: Null Toleranz für neuen Slop

  1. Baseline erfasst Altes – Bestehende Probleme werden anerkannt, aber isoliert
  2. Neuer Slop wird blockiert – Jede neue Abkürzung lässt den Build/Edit fehlschlagen
  3. Ausnahmen erfordern Begründung – Wenn du die Baseline aktualisieren musst, dokumentiere warum
  4. KI-Modelle sind nicht besonders – Dieselben Regeln gelten für menschlichen und KI-generierten Code

Ziel ist es, die allmähliche Anhäufung technischer Schulden zu verhindern, die entsteht, wenn KI-Modelle für "den Test bestehen lassen" optimieren, statt für "das eigentliche Problem lösen".


Kurzreferenz

# Ersteinrichtung
slopwatch init
git add .slopwatch/baseline.json

# Nach jeder KI-Codeänderung
slopwatch analyze

# Strenger Modus (empfohlen)
slopwatch analyze --fail-on warning

# Mit Statistiken (Performance-Debugging)
slopwatch analyze --stats

# Baseline aktualisieren (selten, Grund dokumentieren)
slopwatch analyze --update-baseline

# JSON-Ausgabe für Tooling
slopwatch analyze --output json

Wann überschreiben (fast nie)

Die einzigen gültigen Gründe, die Baseline zu aktualisieren oder eine Regel zu deaktivieren:

SzenarioAktionErforderlich
Drittanbieter erzwingt MusterBaseline aktualisierenCodekommentar mit Erklärung
Generierter Code (nicht bearbeitbar)Zu Ausschlussliste hinzufügenIn Konfiguration dokumentieren
Absichtliche RatenbegrenzungsverzögerungBaseline aktualisierenCodekommentar, nicht im Test
Bereinigung von Legacy-CodeEinmalige Baseline-AktualisierungPR-Beschreibung

Ungültige Gründe:

  • "Der Test ist flaky" → Behebe die Flakiness
  • "Die Warnung ist nervig" → Behebe den Code
  • "Auf meinem Rechner funktioniert es" → Behebe die Race Condition
  • "Wir reparieren es später" → Repariere es jetzt

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

akka-hosting-actor-patterns

Patterns for building entity actors with Akka.Hosting - GenericChildPerEntityParent, message extractors, cluster sharding abstraction, akka-reminders, and ITimeProvider. Supports both local testing and clustered production modes.

akka-net-aspire-configuration

Configure Akka.NET with .NET Aspire for local development and production deployments. Covers actor system setup, clustering, persistence, Akka.Management integration, and Aspire orchestration patterns.

akka-net-best-practices

Critical Akka.NET best practices including EventStream vs DistributedPubSub, supervision strategies, error handling, Props vs DependencyResolver, work distribution patterns, and cluster/local mode abstractions for testability.

akka-net-management

Akka.Management for cluster bootstrapping, service discovery (Kubernetes, Azure, Config), health checks, and dynamic cluster formation without static seed nodes.

akka-net-testing-patterns

Write unit and integration tests for Akka.NET actors using modern Akka.Hosting.TestKit patterns. Covers dependency injection, TestProbes, persistence testing, and actor interaction verification. Includes guidance on when to use traditional TestKit.

api-design

Design stable, compatible public APIs using extend-only design principles. Manage API compatibility, wire compatibility, and versioning for NuGet packages and distributed systems.

aspire-configuration

Configure Aspire AppHost to emit explicit app config via environment variables; keep app code free of Aspire clients and service discovery.

aspire-integration-testing

Write integration tests using .NET Aspire

aspire-service-defaults

Create a shared ServiceDefaults project for Aspire applications. Centralizes OpenTelemetry, health checks, resilience, and service discovery configuration across all services.

crap-analysis

Analyze code coverage and CRAP (Change Risk Anti-Patterns) scores to identify high-risk code. Use OpenCover format with ReportGenerator for Risk Hotspots showing cyclomatic complexity and untested code paths.

csharp-concurrency-patterns

Choosing the right concurrency abstraction in .NET - from async/await for I/O to Channels for producer/consumer to Akka.NET for stateful entity management. Avoid locks and manual synchronization unless absolutely necessary.

database-performance

Database access patterns for performance. Separate read/write models, avoid N+1 queries, use AsNoTracking, apply row limits, and never do application-side joins. Works with EF Core and Dapper.

dependency-injection-patterns

Organize DI registrations using IServiceCollection extension methods. Group related services into composable Add* methods for clean Program.cs and reusable configuration in tests.

dotnet-devcert-trust

Diagnose and fix .NET HTTPS dev certificate trust issues on Linux. Covers the full certificate lifecycle from generation to system CA bundle inclusion, with distro-specific guidance for Ubuntu, Fedora, Arch, and WSL2.

dotnet-local-tools

Managing local .NET tools with dotnet-tools.json for consistent tooling across development environments and CI/CD pipelines.

dotnet-project-structure

Modern .NET project structure including .slnx solution format, Directory.Build.props, central package management, SourceLink, version management with RELEASE_NOTES.md, and SDK pinning with global.json.

efcore-patterns

Entity Framework Core best practices including NoTracking by default, query splitting for navigation collections, migration management, dedicated migration services, and common pitfalls to avoid.

ilspy-decompile

Understand implementation details of .NET code by decompiling assemblies. Use when you want to see how a .NET API works internally, inspect NuGet package source, view framework implementation, or understand compiled .NET binaries.

mailpit-integration

Test email sending locally using Mailpit with .NET Aspire. Captures all outgoing emails without sending them. View rendered HTML, inspect headers, and verify delivery in integration tests.

marketplace-publishing

Workflow for publishing skills and agents to the dotnet-skills Claude Code marketplace. Covers adding new content, updating plugin.json, validation, and release tagging.

Verwandte Skills