.claude/skills/go-nolint-audit/SKILL.md
Audit Go nolint directives for staleness and lazy justifications. Mechanically verifies each suppression with golangci-lint, then runs adversarial Red/Blue/White debates on the top candidates for removal. Use when inheriting a Go codebase, during periodic cleanup, or when nolint count is growing unchecked.
npx skillsauth add dirien/yet-another-agent-harness go-nolint-auditInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Audit //nolint: directives in Go codebases. Finds suppressions that
are stale (code changed, lint rule no longer triggers) or lazily
justified (the underlying code could be fixed instead of suppressed).
Challenges each justification through adversarial debate rather than
accepting comments at face value.
go version 2>/dev/null && golangci-lint --version 2>/dev/null
If go is not installed, stop and report. If golangci-lint is
missing:
Do not proceed without both tools available.
grep -rn '//nolint' --include='*.go' . | grep -v vendor/
Match all variants: //nolint (bare), //nolint:rule,
//nolint:rule1,rule2. For each directive, capture:
//nolint:rule // if present)Bare //nolint (no rule) suppresses everything — flag for Phase 2
automatically. If zero directives found, report a clean codebase
and stop.
For each directive with a named rule, test whether the suppression
is still needed. Co-enable nolintlint alongside the target rule:
# v2 syntax (preferred):
golangci-lint run --enable-only=<rule>,nolintlint \
--allow-parallel-runners <file>
# v1 syntax (if v2 unavailable):
golangci-lint run --disable-all --enable=<rule>,nolintlint \
--allow-parallel-runners <file>
If nolintlint reports the directive as unused, it is stale. This
avoids modifying source files. For multi-rule directives
(//nolint:rule1,rule2), test each rule separately. Run up to 3
parallel shell commands. Always use --allow-parallel-runners.
If golangci-lint fails for reasons other than the target rule (build errors, missing deps), skip the directive and report as "unable to verify."
Categorize each directive:
Report stale directives immediately. If all are stale, skip Phase 2.
Bare //nolint directives skip Phase 1 — they cannot be verified
against a specific rule.
Score all discovered directives (not just the Phase 1 sample) on two dimensions (1-5). For large codebases (50+ directives), sample 5-10 across different rules for Phase 1, but score the full list here to find the worst offenders:
Score = Fixability x Justification quality. Consult
references/go-nolint-patterns.md for scoring guidance.
Debate the top 3 by score:
Stale (safe to remove):
file.go:42 //nolint:errcheck — rule no longer triggers
file.go:87 //nolint:mnd — rule no longer triggers
Unable to verify:
file.go:99 //nolint:gosec — golangci-lint build error
For each debated directive:
#N: file.go:line — //nolint:rule
Current code (with nolint): [5-10 lines of surrounding code]
Justification: "original comment" Lint warning when removed: [exact golangci-lint output]
Red (remove): [argument + concrete diff] Blue (keep): [argument with specific reasoning] White (verdict): REMOVE | KEEP | REWRITE JUSTIFICATION [reasoning]
[If REMOVE: repeat diff for easy application] [If REWRITE: full replacement line with improved justification]
| # | File:Line | Rule | Verdict | Effort | | - | --------- | ---- | ------- | ------ | | 1 | location | rule | verdict | effort | | 2 | location | rule | verdict | effort | | 3 | location | rule | verdict | effort |
Stale: N (remove immediately) | Unable to verify: N
tools
Implements advanced TypeScript type systems, creates custom type guards, utility types, and branded types, and configures tRPC for end-to-end type safety. Use when building TypeScript applications requiring advanced generics, conditional or mapped types, discriminated unions, monorepo setup, or full-stack type safety with tRPC.
development
Use when challenging ideas, plans, decisions, or proposals using structured critical reasoning. Invoke to play devil's advocate, run a pre-mortem, red team, or audit evidence and assumptions.
development
Systematic technical debt analysis across architecture, testing, documentation, and infrastructure. Investigates the codebase, scores findings by impact and effort, and generates a prioritized TECH_DEBT.md remediation plan. Delegates to specialized skills for code quality (scout) and linting (lint-fix). Use when assessing overall project health, planning cleanup sprints, or onboarding to an unfamiliar codebase.
testing
Install and configure Tailscale across platforms. Detects OS, distro, and environment (including WSL2 and containers). Verifies existing installations, performs platform-appropriate install, and guides initial connection. Use when setting up Tailscale on a new machine, onboarding a server to a tailnet, or verifying an existing install.