dotnet-slopwatch

Use o Slopwatch para detectar trapaças de recompensa de LLM em alterações de código .NET. Execute após cada modificação de código para capturar testes desabilitados, avisos suprimidos, blocos catch vazios e outros atalhos que mascaram problemas reais.

O que é dotnet-slopwatch?

O Slopwatch é uma ferramenta anti-trapaça para LLMs (como Claude Code) projetada para detectar 'slop' — atalhos que modelos de linguagem grande (LLMs) tomam para fazer testes passarem ou builds serem bem-sucedidos sem realmente resolver o problema subjacente. A ferramenta é configurada como um gancho pós-edição, analisando automaticamente arquivos .NET modificados e sinalizando padrões como testes desabilitados (`[Fact(Skip="...")]`), supressão de avisos, blocos catch vazios e atrasos arbitrários. O Slopwatch suporta integração direta com Claude Code, Git hooks e pipelines CI/CD (GitHub Actions e Azure DevOps), garantindo que nenhum novo 'slop' seja introduzido durante sessões de codificação assistidas por IA. Também oferece um modo de linha de base para ignorar dívida técnica existente, focando apenas em novas introduções, e um modo estrito que eleva todos os avisos a erros para máxima proteção.

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

Installed? Explore more Programação e Desenvolvimento skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

Slopwatch: Anti-Trapaça para LLM no .NET

Quando Usar Esta Habilidade

Use esta habilidade constantemente. Sempre que um LLM (incluindo Claude) fizer alterações em:

  • Arquivos de código C# (.cs)
  • Arquivos de projeto (.csproj)
  • Arquivos de propriedades (Directory.Build.props, Directory.Packages.props)
  • Arquivos de teste

Execute o slopwatch para validar que as alterações não introduziram "slop".

O que é Slop?

"Slop" se refere a atalhos que LLMs tomam para fazer testes passarem ou builds serem bem-sucedidos sem realmente resolver o problema subjacente. São comportamentos de trapaça de recompensa — o LLM otimiza para sucesso aparente em vez de correções reais.

Padrões Comuns de Slop

PadrãoExemploPor que é Ruim
Testes desabilitados[Fact(Skip="instável")]Esconde falhas em vez de corrigi-las
Supressão de avisos#pragma warning disable CS8618Silencia o compilador sem corrigir o problema
Blocos catch vazioscatch (Exception) { }Engole erros, esconde bugs
Atrasos arbitráriosawait Task.Delay(1000);Mascara condições de corrida, torna testes lentos
Supressão em nível de projeto<NoWarn>CS1591</NoWarn>Desabilita avisos para todo o projeto
Bypass de CPMVersion="1.0.0" inlineEnfraquece o gerenciamento central de pacotes

Nunca aceite esses padrões. Se um LLM introduzir slop, rejeite a alteração e exija uma correção adequada.


Instalação

Como Ferramenta Local (Recomendado)

Adicione em .config/dotnet-tools.json:

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

Depois restaure:

dotnet tool restore

Como Ferramenta Global

dotnet tool install --global Slopwatch.Cmd

Configuração Inicial: Estabelecer uma Linha de Base

Antes de usar o slopwatch em um projeto existente, crie uma linha de base dos problemas atuais:

# Inicializar linha de base a partir do código existente
slopwatch init

# Isso cria .slopwatch/baseline.json
git add .slopwatch/baseline.json
git commit -m "Adicionar linha de base do slopwatch"

Por que linha de base? Código legado pode ter problemas existentes. A linha de base garante que o slopwatch capture apenas novo slop sendo introduzido, não dívida técnica pré-existente.


Uso Durante Sessões com LLM

Após Cada Alteração de Código

Execute slopwatch após qualquer modificação de código gerada por LLM:

# Analisar novos problemas (usa linha de base)
slopwatch analyze

# Usar modo estrito - falhar também em avisos
slopwatch analyze --fail-on warning

Quando o Slopwatch Sinalizar um Problema

Não o ignore. Em vez disso:

  1. Entenda por que o LLM tomou o atalho
  2. Solicite uma correção adequada - seja específico sobre o que está errado
  3. Verifique se a correção não introduz outro slop
# Exemplo: LLM desabilitou um teste
❌ SW001 [Erro]: Teste desabilitado detectado
   Arquivo: tests/MyApp.Tests/OrderTests.cs:45
   Padrão: [Fact(Skip="Teste está instável")]

# Resposta correta: Peça a correção real
"Este teste foi desabilitado em vez de corrigido. Por favor,
investigue por que ele está instável e corrija o problema
subjacente de temporização/condição de corrida."

Atualizando a Linha de Base (Raramente)

Atualize a linha de base apenas quando o slop for verdadeiramente justificado e documentado:

# Adicionar detecções atuais à linha de base (usar com moderação!)
slopwatch analyze --update-baseline

Exemplos de justificativa:

  • Biblioteca de terceiros força um padrão (ex.: deve suprimir aviso específico)
  • Atraso intencional para limitação de taxa (não instabilidade de teste)
  • Código gerado que não pode ser modificado

Documente o motivo em um comentário de código ao atualizar a linha de base.


Integração com Gancho do Claude Code

Adicione o slopwatch como um gancho para validar automaticamente cada edição. Crie ou atualize .claude/settings.json:

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

A flag --hook:

  • Analisa apenas arquivos sujos do git (rápido, mesmo em repositórios grandes)
  • Saída de erros no stderr em formato legível
  • Bloqueia a edição em avisos/erros (código de saída 2)
  • Claude vê o erro e pode corrigi-lo imediatamente

Integração com CI/CD

Adicione o slopwatch ao seu pipeline de CI como um portão de qualidade:

GitHub Actions

jobs:
  slopwatch:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

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

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

      - name: Executar Slopwatch
        run: slopwatch analyze -d . --fail-on warning

Azure Pipelines

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

- script: slopwatch analyze -d . --fail-on warning
  displayName: 'Análise Slopwatch'

Regras de Detecção

RegraGravidadeO que Captura
SW001ErroTestes desabilitados (Skip=, Ignore, #if false)
SW002AvisoSupressão de avisos (#pragma warning disable, SuppressMessage)
SW003ErroBlocos catch vazios que engolem exceções
SW004AvisoAtrasos arbitrários em testes (Task.Delay, Thread.Sleep)
SW005AvisoSlop em arquivos de projeto (NoWarn, TreatWarningsAsErrors=false)
SW006AvisoBypass de CPM (VersionOverride, atributos Version inline)

Configuração

Crie .slopwatch/slopwatch.json para personalizar:

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

Modo Estrito (Recomendado para Sessões com LLM)

Para proteção máxima durante sessões de codificação com LLM, eleve todas as regras para erros:

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

A Filosofia: Tolerância Zero para Novo Slop

  1. Linha de base captura legado - Problemas existentes são reconhecidos, mas isolados
  2. Novo slop é bloqueado - Qualquer novo atalho falha o build/edição
  3. Exceções exigem justificativa - Se precisar atualizar a linha de base, documente por quê
  4. LLMs não são especiais - As mesmas regras se aplicam a código humano e gerado por IA

O objetivo é evitar o acúmulo gradual de dívida técnica que ocorre quando LLMs otimizam para "fazer o teste passar" em vez de "corrigir o problema real".


Referência Rápida

# Configuração inicial
slopwatch init
git add .slopwatch/baseline.json

# Após cada alteração de código do LLM
slopwatch analyze

# Modo estrito (recomendado)
slopwatch analyze --fail-on warning

# Com estatísticas (depuração de desempenho)
slopwatch analyze --stats

# Atualizar linha de base (raro, documente por quê)
slopwatch analyze --update-baseline

# Saída JSON para ferramentas
slopwatch analyze --output json

Quando Substituir (Quase Nunca)

As únicas razões válidas para atualizar a linha de base ou desabilitar uma regra:

CenárioAçãoObrigatório
Biblioteca de terceiros força padrãoAtualizar linha de baseComentário no código explicando por quê
Código gerado (não editável)Adicionar à lista de exclusãoDocumentar na configuração
Atraso intencional para limitação de taxaAtualizar linha de baseComentário no código, não em teste
Limpeza de código legadoAtualização única da linha de baseDescrição no PR

Motivos inválidos:

  • "O teste está instável" → Corrija a instabilidade
  • "O aviso é irritante" → Corrija o código
  • "Funciona na minha máquina" → Corrija a condição de corrida
  • "Vamos corrigir depois" → Corrija agora

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.

Habilidades Relacionadas